когерентность кэша защищенных блокировкой данных

Данные потоки 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? .


person Benito Ciaro    schedule 10.01.2013    source источник
comment
Также обратите внимание, что одновременное выполнение f приведет к гонкам данных. Мьютексы не должны использоваться только для доступа на запись (кто подал вам эту идею?).   -  person R. Martinho Fernandes    schedule 10.01.2013


Ответы (1)


Приобретение мьютекса синхронизируется с освобождением мьютекса. Это означает, что всякий раз, когда вы получаете мьютекс, вы можете наблюдать каждый побочный эффект, который возникает до того, как мьютекс был освобожден. Реализация может реализовать это так, как она хочет. Важно то, что эти эффекты.

person R. Martinho Fernandes    schedule 10.01.2013