iOS线程安全——在线程切换前完成一段代码

标签 ios objective-c nsthread synchronized

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

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

如何实现?

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

最佳答案

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

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

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

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

关于iOS线程安全——在线程切换前完成一段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16131591/

相关文章:

ios - PageViewController 在旋转时崩溃

ios - 如何在饼图上为标签找到合适的位置?

ios - UIButton 颜色自行改变

iOS UITableView reloadData 仅更新我添加的最后一个条目,如何重新加载所有内容?

objective-c - 使用 KVC 跨 n 个键查找最小值

ios - 了解 iOS 中的多线程

swift - block 没有真正执行?

ios - 启动 AVPlayer 时如何显示暂停的视频而不是黑屏

ios - __bridge_transfer 从 CFArrayRef 到 NSArray* - 元素也转移了吗?

iphone - 从线程调用委托(delegate)方法