Если у меня есть один int, который я хочу записать из одного потока и читать из другого, мне нужно использовать std::atomic
, чтобы убедиться, что его значение согласовано по всем ядрам, независимо от того, являются ли инструкции, которые чтение и запись на него концептуально атомарны. Если я этого не сделаю, может быть, что ядро чтения имеет старое значение в своем кеше и не увидит новое значение. Это имеет смысл для меня.
Если у меня есть сложный тип данных, который нельзя прочитать/записать в атомарном режиме, мне нужно защитить доступ к нему с помощью некоторого примитива синхронизации, например std::mutex
. Это предотвратит проникновение объекта (или чтение из него) в несогласованное состояние. Это имеет смысл для меня.
Что для меня не имеет смысла, так это то, как мьютексы помогают с проблемой кэширования, которую атомизация решает. Кажется, что они существуют исключительно для предотвращения параллельного доступа к некоторому ресурсу, но не для распространения каких-либо значений, содержащихся в этом ресурсе, в кэши других ядер. Есть ли какая-то часть их семантики, которую я пропустил, что касается этого?