【发布时间】:2013-04-14 10:32:02
【问题描述】:
我正在寻找一种方法来确保某些代码行总是一起执行(在系统可能切换线程之前)。
据我所知,@synchronized 对此不起作用,因为它只会阻止另一个线程进入这个特定的块。在我的示例中,我有不同的代码部分相互影响,我想确保它们中的每一个都阻止另一个。
如何做到这一点?
编辑:一个用例可能是我正在播放一个 MIDI 文件。事件自动在高优先级线程上发出。在处理单个事件时,玩家可能会被用户停止。我想确保一个音符得到完全处理,或者播放器之前停止并且音符不会消失。
【问题讨论】:
-
如果您有多个相互阻塞的“代码部分”,我的第一次尝试是将它们中的每一个都放在 @synchronize 块中。这种方法有什么问题?
-
你能澄清一下吗? “在系统可能切换线程之前”的概念没有意义,因为线程的想法是它们彼此并发操作(这就是为什么您使用 @synchronized (或其他锁定机制)或专用串行队列来控制共享资源的synchronization。如果您不那么抽象,而是准确地描述您正在尝试做的事情,您的问题可能会更清楚。
-
我添加了一个用例 ;)
-
@Max 这听起来不像是线程安全问题,而更像是您如何与用于播放的库/框架进行交互以确保您的 midi 播放暂停被推迟到音符的结尾,节奏等。不幸的是,这个答案在很大程度上取决于您用于播放的库/框架,我建议您发布一个包含所有这些细节的新问题(哪个库/框架,也许是代码示例等)。
-
在编写自己的多线程例程时,您不必担心代码块不会“一起执行”(因为这是标准行为),线程安全问题是通常使用已经讨论过的同步技术来完成。但是音乐播放库是完全不同的野兽,除非我误解了你,否则我建议就这个完全不同的主题发布一个新问题。
标签: ios objective-c nsthread synchronized