volatile在c类语言里面只是防止将变量优化到寄存器里面,只能解决一个可见性的问题,并不能影响顺序性、互斥性和原子性。volatile只适合于内存映射寄存器/异步信号处理程序访问变量和只需要可见性的多线程共享变量。
java里面volatile是有acquire/release语意,volatile可以解决double checking lock问题
dot net里面所以写操作都有release语意,double checking lock都不需要volatile。
【 在 ArchLinux 的大作中提到: 】
:
: 一种乱序是编译器调度指令会乱序,这种在C语言里的volatile关键字应该可以防止这种情况。另一种乱序是处理器执行指令会乱序,只要保证语义正确,执行顺序有可能和指令序列不一样。
: 在多核的场景下,我们重点关注的是cache coherence和memory consistency的问题。
: cache coherence是说每个核都有自己的cache,那么当一个核向主存中某个地址写数据的时候,另一个核的cache里面存放的是旧值,cache coherence关心的是怎样才能让每个核读到这个这个地址都是读出最新的值。
: memory consistency说的是单个核在保证正确性的时候,可能乱序执行load/store操作,这样对于在其他核执行的程序的视角看,就不能假定这个核是按照程序指令的序列来执行这些load/store操作的,否则就可能出错逻辑上的问题。所以处理器要规定一个memory consistency model,让程序员知道处理器执行load/store的规则,从而写多核代码的时候不会出问题。
#发自zSMTH@NOP-AN00
--
FROM 117.143.124.*