代码之家  ›  专栏  ›  技术社区  ›  neoneye

NSTASK可以安全地在主线程之外使用吗?

  •  0
  • neoneye  · 技术社区  · 14 年前

    昨天我 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的线程问题可能是什么?

    2 回复  |  直到 12 年前
        1
  •  4
  •   Peter Hosey    12 年前

    read somewhere that NSTask isn't thread safe 艾斯

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

    那个页面的一个编辑器遇到的问题是,他们从一个线程启动了自己的进程,然后让线程终止。这导致了崩溃,因为框架无法再将终止进程的通知传递到正确的线程。

    这个 Thread Safety Summary (书签)表示类似的内容,将nstask列在一个类列表中,上面写着:

    在大多数情况下,只要一次只从一个线程使用这些类,就可以从任何线程使用它们。查看类文档了解更多详细信息。

    nstask文档没有对线程进行任何附加说明,因此听起来nstask是__大多数情况下__之一:您可以使用在其上创建的线程中的任务。不要在另一个线程上使用同一个任务,并且(如上所述)确保线程至少与任务进程一样长。

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

    另一种选择是,正如eimantas所建议的,使用nsOperation:执行一个操作,该操作只启动一个特定任务,并等待该任务退出(可能同步地从中读取输出)。任务退出时操作完成。

        2
  •  0
  •   Eimantas    14 年前

    是的,可以,但我建议您使用 NSOperation . 它是kvo不可知论者(不像线程 NSTask )此外,您可能还需要研究接待员关于kvo和线程环境的设计模式(以防需要kvo)。