以下の 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' のコピーが古くなっていることをどのように知るのでしょうか?
これは、アトミックやメモリ バリアを明示的に使用せずに人々が何年にもわたってプログラミングしてきた方法であり、すべて正常に動作します。ミューテックス (またはスピンロック) を取得すると、暗黙的なメモリ バリアが発行されますか? ありがとう。
編集: たぶんこれは、ミューテックスロック機能は揮発性なしで十分ですか?の複製です。.