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

Учитывая потоки 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?
}
}

как ТБ узнает, получив блокировку, что его кэшированная копия «а» устарела?

Это то, как люди программировали целую вечность без явного использования атомарности или барьеров памяти, и все это прекрасно работает. Вызывает ли мьютекс (или спин-блокировку) неявный барьер памяти? Благодарю.

РЕДАКТИРОВАТЬ: Может быть, это дуп Достаточны ли функции блокировки мьютекса без энергозависимости? .

1

Решение

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]