Objective-C中的无锁消息队列
我的iOS应用程序需要将数据从图形线程发送到音频线程。这些数据包(表示要合成的声音)需要存储,直到音频线程准备好对其进行操作。显然,要使用的数据结构是一个队列,其中图形线程推到头部,音频线程从尾部拉出。音频线程正在实时运行,任何锁定都可能导致声音故障。有没有一种线程安全的方法可以在没有锁的情况下执行此操作 我已经尝试了performSelector:onThread:withObject:waitUntilDone,但没有成功。我认为这是因为音频线程没有关联的运行循环Objective-C中的无锁消息队列,objective-c,multithreading,locking,thread-safety,nonblocking,Objective C,Multithreading,Locking,Thread Safety,Nonblocking,我的iOS应用程序需要将数据从图形线程发送到音频线程。这些数据包(表示要合成的声音)需要存储,直到音频线程准备好对其进行操作。显然,要使用的数据结构是一个队列,其中图形线程推到头部,音频线程从尾部拉出。音频线程正在实时运行,任何锁定都可能导致声音故障。有没有一种线程安全的方法可以在没有锁的情况下执行此操作 我已经尝试了performSelector:onThread:withObject:waitUntilDone,但没有成功。我认为这是因为音频线程没有关联的运行循环 在我看来,我可以在这里构建
在我看来,我可以在这里构建类似于基于c数组的环形缓冲区的东西,它将保存指向我的消息的指针,其中生产者线程将负责移动写入头,消费者线程将负责移动读取头。我如何确保这样的东西实际上是线程安全的?提到无锁环形缓冲区可以在不使用低级(汇编)代码的情况下实现,但我对线程如何共享机器控制的理解不够自信,无法确保我实现的实际上是线程安全的。听起来像是
NSOperationQueue
的工作
阅读苹果的并发编程指南开始吧。时间限制并不像你想象的那么重要。您有足够的时间(在合理范围内)提供缓冲 我建议您首先实现一个常规的锁定队列。这可能不会成为问题。如果是的话,可能不会是锁定成为瓶颈。我已经做了大量的音频工作,包括实现了许多您想要做的事情,而使用锁却没有问题
也就是说,我确信有一种方法可以使用中的原语实现无锁线程安全队列。这是一个不错的选择。我也会试试这个。您可以将NSOperationQueue设置为并发性为1,从而有效地为您创建一个串行队列。