MrR*_*ROY 7 multithreading operating-system thread-safety
我最近在阅读Crack Code Interview这本书,但在第257页有一段让我很困惑:
线程是进程的特定执行路径; 当一个线程修改进程资源时,对兄弟线程立即可以看到更改.
IIRC,如果一个线程对变量进行了更改,则更改将首先保存在CPU缓存中(例如,L1缓存),并且除非将变量声明为volatile,否则不保证与其他线程同步.
我对吗?
Dav*_*rtz 10
不,你错了.但这是一个非常普遍的误解.
每个现代多核CPU都具有硬件缓存一致性.L1和类似的缓存是不可见的.像L1缓存这样的CPU缓存与内存可见性无关.
当线程修改进程资源时,更改立即可见.问题是优化导致流程资源不能按照代码指定的顺序进行修改.
如果您的代码有k = j; i = 4; if (j == 2) foo();优化器可能会看到您的第一个赋值读取的值j.所以当你比较它时,它可能不会再费心阅读它,2因为它"知道"它不能改变.但是,另一个线程可能已经改变了它.因此,当需要线程之间的同步时,需要禁用某些类型的优化.这就是做的事情volatile.
如果编译器和CPU没有进行优化并且在编写时精确地执行程序,则volatile永远不需要.内存可见性是关于代码的优化(一些由编译器完成,一些由CPU完成),而不是缓存.