条件変数は通常、参照する状態がミューテックスの下で変更されるように使用されます。ただし、状態が 1 つのセットのみのフラグである場合、同時実行を防ぐためにミューテックスは必要ありません。したがって、次のようなことをしたいかもしれません:
flag = 1;
pthread_cond_broadcast(&cvar);
pthread_cond_broadcast
ただし、これは書き込みメモリ バリアを意味する場合にのみ安全です。そうしないと、待機中のスレッドは、フラグが書き込まれる前に条件変数のブロードキャストが表示される可能性があります。つまり、待機中のスレッドが目覚め、cvar シグナルを消費する可能性がありますが、まだフラグが表示されます0
。
だから、私の質問は次のとおりです。pthread_cond_broadcast
andpthread_cond_signal
呼び出しは、書き込みメモリバリアを意味しますか? もしそうなら、これは関連する POSIX (または他の) 仕様のどこで指定されていますか? この点については、仕様が不明確なようでした。
注: 実際には、これによりメモリ バリアが発生することは承知しています (Linux では、スレッドの起動は完全な CPU メモリ バリアを意味し、クロス ライブラリ関数呼び出しはコンパイラのメモリ バリアを意味するため)。しかし、私はここでスペックが保証するものに興味があります。