当您在没有栅栏或互斥体的情况下执行加载时,加载的值可能来自任何地方,即缓存、寄存器(通过编译器优化)或 RAM...但从您的问题来看,您已经知道这一点。
在大多数互斥体实现中,当您获取互斥体时,始终会显式(例如,mfence、barrier 等)或隐式(例如,用于锁定 x86 上总线的锁定前缀)应用栅栏。这会导致路径上所有缓存的缓存行失效。
请注意,整个缓存并未失效,只是内存位置的相应缓存行失效。这还包括互斥锁的行(通常作为内存中的值实现)。
当然,有一些特定于体系结构的细节,但这就是它的一般工作方式。
另请注意,这并不是使缓存失效的唯一原因,因为一个 CPU 上的某些操作可能需要使另一 CPU 上的缓存失效。在谷歌上搜索“缓存一致性协议”将为您提供有关此主题的大量信息。