【问题标题】:lockless message queue in Objective-CObjective-C 中的无锁消息队列
【发布时间】:2011-03-26 19:52:17
【问题描述】:

我的 iOS 应用需要将数据从图形线程发送到音频线程。这些数据包(表示要合成的声音)需要存储起来,直到音频线程准备好对它们进行操作。显而易见的数据结构是一个队列,其中图形线程推送到头部,音频线程从尾部拉取。音频线程正在实时运行,任何锁定都可能导致可听见的故障。有没有一种线程安全的方法可以在没有锁的情况下做到这一点?

我已经尝试过 performSelector:onThread:withObject:waitUntilDone 没有运气。我认为这是因为音频线程没有关联的运行循环。

在我看来,我可以在这里构建一个基于 c 数组的环形缓冲区,它将保存指向我的消息的指针,生产者线程将负责移动写入头,而消费者线程将负责移动读头。我怎样才能确保这样的事情实际上是线程安全的? The wikipedia on non-blocking algorithms 提到无锁环形缓冲区可以在不使用低级(汇编)代码的情况下实现,但我对自己对线程如何共享对机器的控制的理解不够自信,无法确保我正在实现的内容在事实上线程安全。

【问题讨论】:

    标签: objective-c multithreading locking thread-safety nonblocking


    【解决方案1】:

    听起来像是NSOperationQueue 的工作。

    阅读 Apple 的并发编程指南以开始使用。

    【讨论】:

    • 我也会试试这个。您可以将 NSOperationQueue 设置为并发 1,从而有效地为您创建一个串行队列。
    【解决方案2】:

    时间限制并不像您想象的那么重要。您有足够的时间(在合理范围内)提供缓冲。

    我建议你先实现一个常规的锁定队列。应该不会是问题。如果是的话,它可能不会成为瓶颈的锁定。我已经完成了大量的音频工作,包括实现了许多你想要做的变化,而使用锁没有问题。

    也就是说,我确信有一种方法可以使用OSAtomic.h 中的原语来实现无锁线程安全队列。这是一个很好的blog post

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      相关资源
      最近更新 更多