簡體   English   中英

Oboe C++ 線程 - 如何在不阻塞的情況下讀寫隊列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM