6

次のコードを実行するスレッド 1 があります。

unique_lock<mutex> ul(m);
while(condition == true)
    cv.wait(ul);

そして、このコードを実行するスレッド 2:

condition = false;
cv.notify_one();

残念ながら、私はタイミングの問題にぶつかっています:

T1: condition checks true
                            T2: condition set to false
                            T2: cv.notify_one()
T1: cv.wait()

スレッド 1 は通知を完全に逃し、wait() でブロックされたままになります。述語を使用するバージョンの wait() を使用してみましたが、基本的に同じ結果が得られました。つまり、述語の本体でチェックが実行されますが、返される前に条件の値が変更され、通知が送信されます。その後、述語が返されます。

どうすればこれを修正できますか?

4

2 に答える 2

8

フラグを変更する前に、スレッド 2 が条件のミューテックスをロックするようにして、この競合状態を修正する必要があります。

保護されていないフラグと条件で発生する典型的な競合状態について説明しています。これらの競合状態は、条件の使用におけるミューテックス ロック パターンの理由です。簡単に言えば、条件値のチェックに関係する変数を常にミューテックスで保護します。

スレッド 2 のコード:

unique_lock<mutex> ul(m);
condition = false;
cv.notify_one();
于 2012-07-29T02:46:41.910 に答える
0

への読み取り/書き込みアクセスが競合しているため、データ競合conditionが発生しています。これは、プログラムの動作が定義されていないことを意味します。

競合状態cvはあなたの心配の最も少ないです:プログラムは何でもすることができます!

于 2012-07-29T06:37:56.630 に答える