1

ロックせずにバッファから読み取る必要があるコンシューマ スレッドがあります。プロデューサ スレッドがバッファに書き込みを行っているために操作をスキップする必要がある場合は問題ありません。したがって、最も適切な選択は、いくつかのフラグのアトミックな TestAndSetであるように思えます。

ここで、前述のプロデューサー スレッドもこのフラグを尊重する必要があります。これは、コンシューマーがバッファーから読み取りを行っている間はバッファーへの書き込みを開始できないためです。次のコードのように、atomic_flag::test_and_set を使用してこれを解決できます。

while (flag.test_and_set()) 
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

...しかし、独自のスピン ロックを作成するのは理想的とは言えません。フラグがクリアされた結果としてスレッドが起動されるまで、スレッドをスリープさせたいと思います。何かのようなもの:

flag.enter();

TLDR:一方がロックでき、もう一方がロックできない 2 つのスレッドを同期するにはどうすればよいですか?

4

2 に答える 2

4

を使用しstd::mutexます。

読者はtry_lockブロッキングを避けるために使用できます。

lockライター(プロデューサー)は、通常どおりブロッキング機能を使用できます。

もちろん、ロックのリークを避けるために、 を使用しますstd::unique_lockstd::try_to_lockリーダーは2 番目の引数として渡す必要があります。owns_lock()次に、データを安全に読み取ることができるかどうか、または書き込みが進行中であったかどうかを確認する必要があります。

于 2015-02-16T23:26:40.790 に答える
1

同期方法を混在させることはできません。双方が同意する必要があります。あなたが本当に望んでいるのは、ロックを取得しようとすることであり、失敗した場合はスキップするように思えます。これを達成するために、定期的にtry_lockを使用できますstd::mutex

リーダーが読み取り中にプロデューサーをブロックする場合、ロックレスは不可能です。

于 2015-02-16T23:25:44.667 に答える