gpt4 book ai didi

cocoa - NSTask 可以在主线程之外安全地使用吗?

转载 作者:行者123 更新时间:2023-12-03 17:32:49 29 4
gpt4 key购买 nike

昨天我read somewhere that NSTask isn't thread safe这让我很困扰,因为我在 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 的线程问题可能是什么?

最佳答案

I read somewhere that NSTask isn't thread safe

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

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

Thread Safety Summary (书签)说了类似的话,将 NSTask 列在它所说的类列表中:

In most cases, you can use these classes from any thread as long as you use them from only one thread at a time. Check the class documentation for additional details.

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

但是,我要指出的是,在大多数情况下,不需要在单独的线程上运行任务。单独的进程往往会像进程中的其他线程一样在其他处理器上运行,并且运行循环可以很好地复用许多小事件并保持 UI 响应。您可以使用NSFileHandle's readInBackgroundAndNotify method如果您需要读取任务的输出。您也许可以完全删除工作线程。

正如 Eimantas 所建议的,另一种方法是使用 NSOperation:有一个操作,只需启动特定任务并等待该任务退出(可能同步读取其中的输出)。当任务退出时操作完成。

关于cocoa - NSTask 可以在主线程之外安全地使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3029868/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com