跨线程事件信号(Obj-C)的同步/等待devise?

在Cocoa应用程序中,我有这样的设置:

  1. 主线程(M)可以向某个后台“生产者”线程(B)提交请求,以完成一些工作,比如计算X项目的结果。
  2. 此后不久,不同的后台线程(C)可能需要计算项目X的结果,并且同时要求这些结果。

线程C可以自己重新同步工作,但是如果线程B恰好在计算项X的中间,我想要线程C阻塞并从B得到结果。计算的结果是可以find的磁盘,所以数据传递不是问题。

在线程B完成项目X之前,阻塞线程C的最好方法是什么?

注意那里的B进程是任意的–X只是这个例子中很多项目中的一个。 我想要阻止,直到具体项目X完成。

所以从概念上讲,我想要的是当线程B开始说“我在X上工作”时,设置某种标志的方法,如果C进来看到那个标志,就等待标志清除,然后得到结果。

不知道我是否可以将NSLockslocking在这个angular色中,或者如果操作系统中有一个更好的基元。

任何想法(或潜在的重构问题)欢迎! 谢谢。

如果可能的话,使用NSOperation 。 它有一个-waitUntilFinished方法允许同步计算。 你只需要一些线程安全的存储机制,让你find你正在计算的项目的NSOperation ,如果它已经存在 – 例如,一个NSLock守护NSDictionary

一个NSConditionLock可以在这里很好地工作。 也许一个条件锁与每个X相关联。最初条件“hibernate”,然后设置为由后台线程“处理”,然后设置为“完成”,当它完成。 调用线程可以检查“正在处理”状态,如果已经设置,请等到条件“complete”完成。