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

3
在Cocoa应用程序中,我有如下设置:
1.主线程(M)可以向某个后台“生产者”线程(B)提交请求,以完成一些工作,例如对项目X进行计算的结果。
2.稍后,不同的后台线程(C)可能希望同步获得计算项目X的结果。
3.如果线程B正在计算项目X,则线程C可以自己同步地重新执行该工作,但如果B在线程X上已经在处理过程中,我希望线程C能够阻塞并从B获取结果。计算的结果可以在磁盘上找到,因此数据传递不是问题。
那么,如何最好地阻止线程C,直到线程B完成项目X呢?
需要注意的是,B处理的项目是任意的--X只是此示例中的一个项目。我希望阻塞线程,直到特定项目X完成。
所以,在概念上,我想要一种方法,让线程B在开始时设置一些标志,表明“我正在处理X”,如果C进来并看到该标志,则等待该标志被清除,然后获得结果。
不确定是否可以将NSLocks硬塞到这个角色中,或者操作系统中是否有更好的原语。
欢迎任何想法(或可能重构问题)!谢谢。
2个回答

4

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


1
谢谢。这可能是最好的答案,尽管我最终会执行类似下面的操作,因为-waitUntilFinished是一个仅限于4.x版本的方法。 - Ben Zotto

3

在这里,可以使用NSConditionLock。为每个X关联一个条件锁。最初的条件是“休眠”,然后由后台线程设置为“处理中”,完成后设置为“完成”。调用线程可以检查“处理中”条件,如果设置了,则等待达到“完成”条件。


谢谢。这是一个有用的思考问题的方式,可能更适合我的需求。 - Ben Zotto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接