Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C中的无锁消息队列_Objective C_Multithreading_Locking_Thread Safety_Nonblocking - Fatal编程技术网

Objective-C中的无锁消息队列

Objective-C中的无锁消息队列,objective-c,multithreading,locking,thread-safety,nonblocking,Objective C,Multithreading,Locking,Thread Safety,Nonblocking,我的iOS应用程序需要将数据从图形线程发送到音频线程。这些数据包(表示要合成的声音)需要存储,直到音频线程准备好对其进行操作。显然,要使用的数据结构是一个队列,其中图形线程推到头部,音频线程从尾部拉出。音频线程正在实时运行,任何锁定都可能导致声音故障。有没有一种线程安全的方法可以在没有锁的情况下执行此操作 我已经尝试了performSelector:onThread:withObject:waitUntilDone,但没有成功。我认为这是因为音频线程没有关联的运行循环 在我看来,我可以在这里构建

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

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


在我看来,我可以在这里构建类似于基于c数组的环形缓冲区的东西,它将保存指向我的消息的指针,其中生产者线程将负责移动写入头,消费者线程将负责移动读取头。我如何确保这样的东西实际上是线程安全的?提到无锁环形缓冲区可以在不使用低级(汇编)代码的情况下实现,但我对线程如何共享机器控制的理解不够自信,无法确保我实现的实际上是线程安全的。

听起来像是
NSOperationQueue
的工作


阅读苹果的并发编程指南开始吧。

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

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


也就是说,我确信有一种方法可以使用中的原语实现无锁线程安全队列。这是一个不错的选择。

我也会试试这个。您可以将NSOperationQueue设置为并发性为1,从而有效地为您创建一个串行队列。