我正在寻找一种方法来确保某些代码行始终一起执行(在系统可能切换线程之前)。
据我所知,@synchronized 对此不起作用,因为它只会阻止另一个线程进入这个特定的 block 。在我的示例中,我有不同的代码部分,它们相互影响,我想确保它们中的每一个都阻止另一个。
如何实现?
编辑:一个用例可能是我正在播放一个 midi 文件。事件自动在高优先级线程上发生。在处理单个事件时,播放器可能会被用户停止。我想确保要么一个音符得到完全处理,要么播放器之前停止并且音符不会消失。
最佳答案
无法确保您的代码不会被操作系统抢占。您有两种选择来限制发生这种情况的可能性:
在高优先级线程上运行您的代码。
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH);
会返回这样一个队列。此队列上的代码将在任何其他优先级较低的队列上的代码之前运行。尽管可能性较小,但您仍有可能被抢占。使用锁、信号量、@synchrosized 或如@Rob 所建议的那样,使用专用串行调度队列来串行化对关键代码部分的访问。通过这样做,在其他线程完成之前,其他线程将无法运行该代码段。如果使用得当,这将保证代码段不会被两个线程同时执行。
也许您可以告诉我们更多关于您的问题的信息?也许有一些代码示例?
关于iOS线程安全——在线程切换前完成一段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16131591/