3

以下のScott Meyersの本でEffective Modern C ++の条件変数について読んでいます。

std::condition_variable   cv
std::mutex                m

T1 (detecting task)

...
cv.notify_one();


T2 (reacting task)

...
{
  std::unique_lock<std::mutex> lk(m);
  cv.wait(lk);

  ...
}

ここで著者は以下のように述べています

ミューテックスは共有データへのアクセスを制御するために使用されますが、検出タスクと反応タスクがそのような仲介を必要としない可能性は十分にあります。たとえば、検出タスクはグローバル データ構造の初期化を担当し、それを反応タスクに引き渡して使用する場合があります。検出タスクが初期化後にデータ構造にアクセスしない場合、および検出タスクが準備完了を示す前に反応タスクがアクセスしない場合、2 つのタスクはプログラム ロジックを通じて互いの邪魔にならないようにします。ミューテックスは必要ありません。

上記のテキストについて、私は理解するのが難しい

  1. 著者が「2 つのタスクがプログラム ロジックを介して互いの邪魔にならないようにする」とはどういう意味ですか?

  2. 作成者がミューテックスを必要としないとはどういう意味ですか?

4

4 に答える 4

2

Mutex は競合状態を解決するために使用されます。

競合状態は、2 つ以上のスレッドが共有データにアクセスでき、同時にそれを変更しようとすると発生します。

あなたの場合、構造で行われる操作は別の時間枠で行われるため、つまり、競合状態を引き起こさないため、これは起こりません。2 つのスレッドが同時に書き込みを行っていないため、ミューテックスは必要ありません。

また、ほとんどの問題は、「check-then-act」(たとえば、値が X の場合は「check」、値が X であることに依存する何かを行うために「act」) があり、別のスレッドが値に対して何かを行うときに発生することも考慮してください。 「確認」と「行為」の間。

于 2015-12-03T11:51:54.773 に答える
0

引用もよくわかりません。共有データを保護していない場合、メモリ アクセスにミューテックスは必要ありません。これは、検出タスクがミューテックスをロックする必要がないことを意味する場合があります。

ただし、c++11condition_variableを使用するにはミューテックスが必要です。これは、少なくとも一部の基盤となる OS 実装が、pthreads などのミューテックスを必要とするためです。

参照 : pthread の条件変数関数にミューテックスが必要なのはなぜですか?

于 2015-12-03T12:08:12.527 に答える