posix standard говорит, что такие вещи, как мьютекс, будут обеспечивать синхронизацию памяти. Однако компилятор может изменить порядок доступа к памяти. Скажем,
lock(mutex);
setdata(0);
ready = 1;
unlock(mutex);
Он может быть изменен на следующий код путем переупорядочения компилятора, правильно?
ready = 1;
lock(mutex);
setdata(0);
unlock(mutex);
Итак, как mutex может синхронизировать доступ к памяти? Чтобы быть более точным, как компиляторы знают, что переупорядочение не должно происходить через блокировку/разблокировку?
на самом деле здесь для аспекта с одним потоком, готовый переупорядоченный присваивание полностью безопасен, поскольку готовый не используется в блокировке функций (mutex).
Редакция: Поэтому, если вызов функции - это то, что компилятор не получит, мы можем рассматривать это как барьер памяти компилятора, например
asm volatile("" ::: "memory")