確かに、ロックレス キューがあります。ただし、コメントで述べたことに基づいて、書き込みごとにスレッドを作成しているため、ここでのパフォーマンスはまったく重要ではありません。
したがって、これは条件変数の標準的な使用例です。ミューテックス、条件変数、リンク リスト (または必要に応じて循環バッファー)、およびキャンセル フラグを含む構造体を作成します。
write:
lock the mutex
(optionally - check the cancel flag to prevent leaks of stuff on the list)
add the event to the list
signal the condition variable
unlock the mutex
read:
lock the mutex
while (list is empty AND cancel is false):
wait on the condition variable with the mutex
if cancel is false: // or "if list non-empty", depending on cancel semantics
remove an event from the list
unlock the mutex
return event if we have one, else NULL meaning "cancelled"
cancel:
lock the mutex
set the cancel flag
(optionally - dispose of anything on the list, since the reader will quit)
signal the condition variable
unlock the mutex
外部ノードでリストを使用している場合は、メモリを保持する時間を短縮するために、ミューテックス ロックの外側にメモリを割り当てたい場合があります。しかし、侵入型のリスト ノードを使用してイベントを設計する場合は、おそらく最も簡単です。
編集:キャンセル時に「シグナル」を「ブロードキャスト」に変更すると、複数のリーダーをサポートすることもできます(特定のイベントを取得するポータブル保証はありません)。必要ありませんが、費用もかかりません。