【问题标题】:iOS Thread safety - Complete a block of code before thread switchesiOS 线程安全——在线程切换前完成一段代码
【发布时间】:2013-04-14 10:32:02
【问题描述】:

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

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

如何做到这一点?

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

【问题讨论】:

  • 如果您有多个相互阻塞的“代码部分”,我的第一次尝试是将它们中的每一个都放在 @synchronize 块中。这种方法有什么问题?
  • 你能澄清一下吗? “在系统可能切换线程之前”的概念没有意义,因为线程的想法是它们彼此并发操作(这就是为什么您使用 @synchronized (或其他锁定机制)或专用串行队列来控制共享资源的synchronization。如果您不那么抽象,而是准确地描述您正在尝试做的事情,您的问题可能会更清楚。
  • 我添加了一个用例 ;)
  • @Max 这听起来不像是线程安全问题,而更像是您如何与用于播放的库/框架进行交互以确保您的 midi 播放暂停被推迟到音符的结尾,节奏等。不幸的是,这个答案在很大程度上取决于您用于播放的库/框架,我建议您发布一个包含所有这些细节的新问题(哪个库/框架,也许是代码示例等)。
  • 在编写自己的多线程例程时,您不必担心代码块不会“一起执行”(因为这是标准行为),线程安全问题是通常使用已经讨论过的同步技术来完成。但是音乐播放库是完全不同的野兽,除非我误解了你,否则我建议就这个完全不同的主题发布一个新问题。

标签: ios objective-c nsthread synchronized


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多