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

Posted

技术标签:

【中文标题】跨线程事件信号(Obj-C)的同步/等待设计?【英文标题】:Synchronization/wait design for cross-thread event signaling (Obj-C)? 【发布时间】:2010-11-04 18:12:49 【问题描述】:

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

    主线程 (M) 可以向某个后台“生产者”线程 (B) 提交请求以完成某些工作,例如对项目 X 的​​计算结果。 此后不久,不同的后台线程 (C) 可能想要计算项目 X 的​​结果,并希望这些结果同步。

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

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

请注意,B 处理的项目是任意的——X 只是此示例中的许多项目之一。我想阻止,直到特别项目 X 完成。

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

不确定我是否可以以某种方式将 NSLocks 硬塞到这个角色中,或者操作系统中是否有更好的原语。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢。这可能是最好的答案,尽管我最终会做类似下面的事情,因为-waitUntilFinished 是一种仅限 4.x 的方法。【参考方案2】:

NSConditionLock 在这里可以很好地工作。可能是与每个 X 关联的条件锁。最初条件为“休眠”,然后由后台线程设置为“处理”,然后在完成时设置为“完成”。调用线程可以检查“处理”条件,如果已设置,则等待条件“完成”。

【讨论】:

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

以上是关于跨线程事件信号(Obj-C)的同步/等待设计?的主要内容,如果未能解决你的问题,请参考以下文章

跨分割问题

信号量互斥量同步变量条件变量和事件变量

使用 Windows 中的事件同步线程

C#多线程:深入了解线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)

内核对象进行线程同步

Even事件