[英]How to implement a blocking queue in C++ to process data between threads?
[英]Oboe C++ Threads - How to read and write to a queue without blocking
我正在尝试为带有双簧管的音频系统编写缓冲区,注意事项是
回调该做什么和不该做什么 您永远不应该执行可能在
onAudioReady
内部onAudioReady
的操作。 阻塞操作的例子包括:例如,使用
malloc()
或 new 分配内存;文件操作,如打开、关闭、读取或写入;
网络操作,如流媒体;
使用互斥锁或其他同步原语 sleep
停止或关闭流
在调用它的流上调用
read()
或write()
音频线程从我的缓冲区读取,解码器线程写入它,你可以想象这一切都很好,直到线程问题出现。我的主要问题是我只能使用互斥锁来解决这个问题,但如果我这样做,我将阻止一个线程,如果音频线程被阻塞,那么声音基本上不会播放,导致“爆米花”声音。 (一个听着很烦人的声音)
我通过回调播放声音,在那里我将数据提供给它。
DataCallbackResult
OboeStreamCallback::onAudioReady(AudioStream *audioStream, void *audioData, int32_t numFrames) {
// fill data here
return DataCallbackResult::Continue;
}
所以我的主要问题是如何解决从音频线程读取数据的问题,同时又不阻塞音频线程,因此它仍然可以播放音频?
这对我来说听起来不可能。 如何在没有互斥锁的情况下确保线程安全? 双簧管如何期望您不使用互斥锁进行动态音频解码?
您可以使用线程安全的无锁队列来读取/写入数据。 这将避免对互斥锁的需要,速度会更快,并且应该可以解决您的“爆米花”问题。
可以在此处找到示例实现: https : //github.com/google/oboe/blob/master/samples/RhythmGame/src/main/cpp/utils/LockFreeQueue.h
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.