2010-11-04 59 views
3

在Cocoa程序,我有这样的设置:跨线程事件信号(Obj-C)的同步/等待设计?

  1. 主线程(M),可以提交请求到一些背景“生产者”线程(B)得到一些工作做,说的结果对项目X的计算。
  2. 此后不久,不同的后台线程(C)可能需要计算项目X的结果,并且需要同步这些结果。

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

什么是阻塞线程C的最佳方式,直到线程B完成项目X?

请注意,那里的项目B进程是任意的 - X只是本示例中许多项目之一。我想阻止,直到具体的项目X完成。

因此,从概念上讲,我想要的是当线程B开始说“我正在处理X”时,线程B设置某种标志的方式,如果C进来并看到该标志,它将等待标志清除,然后得到结果。

不知道我是否可以以某种方式将NSLocks拉进这个角色,或者如果在操作系统中有一个更好的基元。

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

回答

4

如果可能,请使用NSOperation。它有一个-waitUntilFinished方法来允许同步计算。您只需要一些线程安全的存储机制,以便您可以找到要计算的物品的NSOperation(如果它已经存在) - 例如,NSLock守护NSDictionary

+1

谢谢。这可能是最好的答案,尽管我最终会做更像下面这样的事情,因为'-waitUntilFinished'是一个只有4.x的方法。 – 2010-11-05 00:50:38

3

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

+0

谢谢。这是思考问题的有用方式,可能更适合我的需求。 – 2010-11-05 20:25:12