我的iOS应用程序需要将数据从图形线程发送到音频线程。这些数据包(表示要合成的声音)需要存储,直到音频线程准备好对它们执行操作。最明显的数据结构是一个队列,其中图形线程推到头部,音频线程从尾部拉出。音频线程是实时运行的,任何锁定都可能导致声音故障。有没有一种没有锁的线程安全的方法来做到这一点?
我已经试过performSelector:onThread:withObject:waitUntilDone了,但没有成功。我认为这是因为音频线程没有相关的run循环。
在我看来,我可以在这里构建一个类似于c数组的环形缓冲区,它将保存指向我的消息的指针,其中生产者线程负责移动写磁头,而消费者线程负责移动读磁头。我如何才能确保这样的东西实际上是线程安全的?The wikipedia on non-blocking algorithms提到无锁环缓冲区是可以在不使用低级(汇编)代码的情况下实现的,但我对线程如何共享机器的控制权的理解不够有信心,无法确保我正在实现的东西实际上是线程安全的。
发布于 2011-03-27 13:52:35
听起来像是NSOperationQueue的工作。
阅读Apple的并发编程指南开始吧。
发布于 2011-03-27 14:58:11
时间限制并不像你想的那样关键。您有足够的时间(在合理范围内)来提供缓冲区。
我建议你先实现一个常规的锁定队列。这可能不是问题。如果是这样的话,锁定可能不会成为瓶颈。我已经做了大量的音频工作,包括实现了许多你想要做的事情,并且使用锁没有问题。
也就是说,我确信有一种方法可以使用OSAtomic.h中的原语实现一个无锁的线程安全队列。这是一个很好的blog post。
https://stackoverflow.com/questions/5444895
复制相似问题