对于volatile关键字,如果一个变量被它修饰,在生成汇编语言,大概会有个 0x01a3de24:lock addl $0x0,(%esp) ;...f0830424 00
这个操作相当于是一个内存屏障,只有一个cpu访问内存时,并不需要内存屏障;但是如果有两个或者更多cpu访问同一块内存时,且其中一个在观测另外一个,就需要内存屏障来保证一致性了。这句中的:addl $0×0,(%esp) 指令(把esp寄存器里的值加0)显然是一个空操作,关键在于lock前缀,查询IA32 手册,它的作用是是的本cpu的cache 写入了内存,该写入动作也会引起别的cpu或者别的内核无效化其cache,这种操作相当于对cache中的变量做了次“store”和“write”操作所以通过这样一个空操作,可以让前面的volatile变量的修改对其他cpu立即可见;
网友评论