1

以下の f() でスレッド TA と TB が競合している場合:

struct C {
  C(): a(0) {}
  int a;
  std::mutex mtx;
  void f() {
    ... // use 'a' in readonly mode
    std::lock_guard<std::mutex> lock(mtx); // assume TA gets the lock first, then TB
    a += 2; // what value of 'a' will TB see?
  }
}

TB は、ロックを取得したときに、キャッシュされた 'a' のコピーが古くなっていることをどのように知るのでしょうか?

これは、アトミックやメモリ バリアを明示的に使用せずに人々が何年にもわたってプログラミングしてきた方法であり、すべて正常に動作します。ミューテックス (またはスピンロック) を取得すると、暗黙的なメモリ バリアが発行されますか? ありがとう。

編集: たぶんこれは、ミューテックスロック機能は揮発性なしで十分ですか?の複製です。.

4

1 に答える 1

2

ミューテックスの取得は、ミューテックスの解放と同期します。つまり、ミューテックスを取得するたびに、ミューテックスが解放される前にシーケンスされたすべての副作用を観察できます。実装は、必要に応じて自由に実装できます。重要なのは、効果がこれらであるということです。

于 2013-01-10T12:36:32.367 に答える