Данные потоки TA и TB, конкурирующие в f() ниже:
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» устарела?
Именно так люди веками программировали, явно не используя атомы или барьеры памяти, и все это прекрасно работает. Вызывает ли получение мьютекса (или спин-блокировки) неявный барьер памяти? Спасибо.
EDIT: возможно, это дубликат Достаточно ли функций блокировки мьютекса без volatile? а> .
f
приведет к гонкам данных. Мьютексы не должны использоваться только для доступа на запись (кто подал вам эту идею?). - person R. Martinho Fernandes   schedule 10.01.2013