pthreads では、標準的な方法は、mutexを使用し、条件変数を使用して、別のスレッドによって起動されるまで1 つのスレッドで待機することです。
ライターが一時的にブロックされますが、不確定な時間ブロックされることはなく、未読データを破棄することでバッファ オーバーフローが処理される疑似コード:
ライター 書く:
acquire new data to write
lock mutex
get current writing position in buffer
compare to current reading position and check for overflow
in case of overflow, update reading position (oldest data lost)
write new data to buffer
update writing position
do wakeup on condition variable
unlock mutex
読者の読み:
lock mutex
loop:
get current reading position in buffer
compare to current writing position in buffer
if there's new data, break loop
wait (possibly with timeout) on condition variable
goto loop:
copy data from buffer
update reading position
unlock mutex
process copied data
上記で明らかなように、ライターは一時的にミューテックスをブロックする可能性がありますが、リーダーは一時的にミューテックスを保持するだけなので (これはバッファー内のデータがかなり短いことを前提としています)、おそらく問題にはなりません。
上記のコードを理解するための重要な詳細: 条件変数とミューテックスはペアとして機能します。条件変数を待機するとミューテックスのロックが解除され、ウェイクアップされると、ミューテックスを再ロックできるようになった後にのみ続行されます。したがって、ライターがミューテックスのロックを解除するまで、リーダーは実際には続行しません。
条件変数の待機が戻ったときにバッファの位置を再度確認することが重要です。また、データを追加しただけのライターによってウェイクアップが行われたと盲目的に信じないでください。