那么 volatile 变量能够保证可见性的实现原理是什么?
声明成volatile的变量,在编译成汇编指令的时候,会多出以下一行:
0x0bca13ae:lock addl $0x0,(%esp) ;
这一句指令的意思是在寄存器上做一个+0的空操作,但这条指令有个Lock前缀。
而处理器在处理Lock前缀指令时,其实是声言了处理器的Lock#信号。
在之前的处理器中,Lock#信号会导致传输数据的总线被锁定,其他处理器都不能访问总线,从而保证处理Lock指令的处理器能够独享操作数据所在的内存区域。
但由于总线被锁住,其他的处理器都被堵住了,影响多处理器执行的效率。在后来的处理器中,声言Lock#信号的处理器,不会再锁住总线,而是检查到数据所在的内存区域,如果是在处理器的内部缓存中,则会锁定此缓存区域,将缓存写回到内存当中,并利用缓存一致性的原则来保证其他处理器中的缓存区域数据的一致性。