Когда вы выполняете загрузку без заборов или мьютексов, то загруженное значение может потенциально прийти откуда угодно, например, из кеша, регистров (посредством оптимизации компилятора) или из ОЗУ ... но из вашего вопроса вы уже знали это .
В большинстве реализаций мьютекса, когда вы получаете мьютекс, всегда применяется ограничение, либо явно (например, mfence, барьер и т. Д.), Либо неявно (например, префикс блокировки для блокировки шины на x86). Это приводит к тому, что строки кэша всех кэшей на пути становятся недействительными.
Обратите внимание, что весь кэш не признан недействительным, только соответствующие строки кэша для области памяти. Сюда также входят строки для мьютекса (который обычно реализуется как значение в памяти).
Конечно, есть детали, специфичные для архитектуры, но в целом это так.
Также обратите внимание, что это не единственная причина аннулирования кэшей, так как могут быть операции на одном процессоре, которые потребуют кэширования на другом, чтобы сделать его недействительным. Выполнение в Google поиска по «протоколам согласованности кэша» предоставит вам много информации по этому вопросу.