Ваш пример будет работать просто отлично.
Несколько процессоров используют протокол когерентности , например MESI , чтобы обеспечить синхронизацию данных между кэшами. При использовании MESI каждая строка кэша считается либо модифицированной, либо исключительно хранящейся, совместно используемой ЦП, либо недействительной. Запись строки кэша, разделяемой между процессорами, приводит к тому, что она становится недействительной в других процессорах, поддерживая синхронизацию кэшей.
Однако этого недостаточно. Разные процессоры имеют разные модели памяти , и большинство современных процессоров поддерживают некоторый уровень переупорядочения обращений к памяти. В этих случаях необходимы барьеры памяти .
Например, если у вас есть тема A:
DoWork();
workDone = true;
И Нить B:
while (!workDone) {}
DoSomethingWithResults()
Поскольку оба выполняются на отдельных процессорах, нет гарантии, что записи, выполненные в DoWork (), будут видны потоку B до того, как запись в workDone и DoSomethingWithResults () перейдут в потенциально несовместимое состояние. Барьеры памяти гарантируют некоторый порядок чтения и записи - добавление барьера памяти после DoWork () в потоке A приведет к завершению всех операций чтения / записи, выполняемых DoWork, перед записью в workDone, так что поток B получит согласованное представление. Мьютексы по своей природе обеспечивают барьер памяти, так что чтение / запись не может передать вызов для блокировки и разблокировки.
В вашем случае один процессор будет сигнализировать другим, что он загрязнит строку кэша и вынудит другие процессоры перезагрузиться из памяти. Получение мьютекса для чтения и записи значения гарантирует, что изменение памяти будет видно другому процессору в ожидаемом порядке.