![](/img/trans.png)
[英]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.