- 主题:经常看到内存屏障,查了很多资料,感觉自己不会编程了
编译器、执行环境/虚拟机、体系结构会保证单线程的执行效果和直面代码逻辑一致,不要胡思乱想天塌下来。
多线程,多核多cpu smt/ht的情况有一定的内存一致性模型,同步互斥原语等,剩下的才是程序员需要考虑的。一般你加了锁,多数多线程共享资源问题就解决了,剩下的是无锁编程才需要考虑的
【 在 freyoneby 的大作中提到: 】
:
: 比如一段代码
: head++;
: rear++;
: flag=0;
#发自zSMTH@NOP-AN00
--
FROM 117.143.124.*
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.*
lock不是内存屏障指令而是总线锁定,当然它带有mfence的语意。
lfence/sfence/mfence才是intel的内存屏障。
内存屏障指令的含义和内存一致性或者顺序性有关,先了解内存一致性相关概念。
【 在 xeagle @ [CSArch] 的大作中提到: 】
:
: 想请教一下内存屏障指令的细节. 看了一本书, 但只是简单介绍了一下这方面, 还是不能完全搞明白.
: 比如下面的指令:
: mov xxx
: lock xxx
#发自zSMTH@NOP-AN00
--
FROM 39.144.103.*