0

昨天我在某处读到 NSTask 不是线程安全的,这让我很困扰,因为我在 NSThread 中运行 NSTask 并且到目前为止还没有遇到任何线程问题。

我的代码是这样组织的

A: main thread -> B: worker thread -> C: worker task

C: The worker task is a commandline program.
B: The worker thread can start/stop the worker task and send it commands.
A: The main thread can send commands to the worker thread.

如果 NSTask 应该只在主线程中使用,那么我正在考虑将 NSTask 启动/停止代码移动到主线程,以防止可能的线程问题。

NSTask 可以在主线程外使用吗?

如果不是,那么 NSTask 的线程问题可能是什么?

4

2 回答 2

4

在某处读到 NSTask 不是线程安全的……</p>

那不是那个页面说的。它说您将在启动它的同一线程上收到进程终止通知,这表明 NSTask 知道线程并尝试做正确的事情。

该页面的一位编辑遇到的问题是他们从一个线程开始他们的进程,然后让线程死掉。这导致了崩溃,因为框架不再能够将进程终止通知传递给正确的线程。

线程安全摘要(书签)说了类似的话,将 NSTask 列在它说的类列表中:

在大多数情况下,您可以在任何线程中使用这些类,只要您一次仅在一个线程中使用它们。检查类文档以获取更多详细信息。

NSTask 文档没有说明任何关于线程的额外内容,因此听起来 NSTask 是“大多数情况”之一:您可以使用创建它的线程中的任务。不要在另一个线程上使用相同的任务,并且(如上所述)确保线程至少与任务进程一样长。

然而,我会注意到,在大多数情况下,不需要在单独的线程上运行任务。单独的进程倾向于像进程中的其他线程一样在其他处理器上运行,并且运行循环在多路复用许多小事件和保持 UI 响应方面做得很好。如果需要读取任务的输出,可以使用NSFileHandle 的readInBackgroundAndNotify方法。您也许可以完全切断您的工作线程。

另一种方法是,正如 Eimantas 建议的那样,使用 NSOperation:有一个简单地启动特定任务并等待该任务退出的操作(可能同步读取它的输出)。任务退出时操作完成。

于 2010-06-13T00:50:47.303 回答
0

是的,它可以,但我建议你使用NSOperation. 它与 KVO 无关(与 threaded 不同NSTask)。此外,您可能想研究有关 KVO 和线程环境的接待员设计模式(如果您需要 KVO)。

于 2010-06-12T20:01:46.913 回答