1

我正在寻找一种方法来确保某些代码行总是一起执行(在系统可能切换线程之前)。

据我所知,@synchronized 对此不起作用,因为它只会阻止另一个线程进入这个特定的块。在我的示例中,我有不同的代码部分相互影响,我想确保它们中的每一个都阻止另一个。

如何做到这一点?

编辑:一个用例可能是我正在播放一个 MIDI 文件。事件会自动在高优先级线程上发出。在处理单个事件时,玩家可能会被用户阻止。我想确保一个音符得到完全处理,或者播放器之前停止并且音符不会消失。

4

1 回答 1

1

无法确保您的代码不会被操作系统抢占。您有两种选择可以限制发生这种情况的可能性:

  1. 在高优先级线程上运行您的代码。dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH);将返回这样的队列。此队列上的代码将在任何其他较低优先级队列上的代码之前运行。尽管可能性较小,但您仍然可能会被抢占。

  2. 使用锁、信号量、@synchrosized 或 @Rob 建议的专用串行调度队列来序列化对关键代码部分的访问。通过这样做,在另一个线程完成之前,没有其他线程能够运行那段代码。如果使用正确,这将保证代码段不会被两个线程同时执行。

也许你可以告诉我们更多关于你的问题?也许有一些代码示例?

于 2013-04-21T14:59:11.177 回答