【发布时间】: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