ロックせずにバッファから読み取る必要があるコンシューマ スレッドがあります。プロデューサ スレッドがバッファに書き込みを行っているために操作をスキップする必要がある場合は問題ありません。したがって、最も適切な選択は、いくつかのフラグのアトミックな TestAndSetであるように思えます。
ここで、前述のプロデューサー スレッドもこのフラグを尊重する必要があります。これは、コンシューマーがバッファーから読み取りを行っている間はバッファーへの書き込みを開始できないためです。次のコードのように、atomic_flag::test_and_set を使用してこれを解決できます。
while (flag.test_and_set())
{
std::this_thread::sleep_for(std::chrono::seconds(1));
}
...しかし、独自のスピン ロックを作成するのは理想的とは言えません。フラグがクリアされた結果としてスレッドが起動されるまで、スレッドをスリープさせたいと思います。何かのようなもの:
flag.enter();
TLDR:一方がロックでき、もう一方がロックできない 2 つのスレッドを同期するにはどうすればよいですか?