多线程 – 一个进程之间的线程可见性

我最近在阅读Crack Code Interview这本书,但在第257页有一段让我很困惑:

A thread is a particular execution path of a process; when one thread modifies a process resource, the change is immediately visible to sibling threads.

IIRC,如果一个线程对变量进行了更改,则更改将首先保存在CPU缓存中(例如,L1缓存),并且除非将变量声明为volatile,否则不保证与其他线程同步.

我对吗?

最佳答案
不,你错了.但这是一个非常普遍的误解.

每个现代多核CPU都有硬件cache coherence.L1和类似的缓存是不可见的.像L1缓存这样的CPU缓存与内存可见性无关.

当线程修改进程资源时,更改立即可见.问题是优化导致流程资源不能按照代码指定的顺序进行修改.

如果你的代码有k = j; i = 4; if(j == 2)foo();优化器可能会看到您的第一个赋值读取j的值.因此,当你将它与2进行比较时,它可能不会再次阅读它,因为它“知道”它无法改变.但是,另一个线程可能已经改变了它.因此,当需要线程之间的同步时,需要禁用某些类型的优化.这就像volatile那样的东西.

如果编译器和CPU没有进行优化并且在编写程序时精确地执行了程序,则永远不需要volatile.内存可见性是关于代码的优化(一些由编译器完成,一些由CPU完成),而不是缓存.

转载注明原文:多线程 – 一个进程之间的线程可见性 - 代码日志