volatile原子性的最优解释(看了30多篇文章最终解惑)

第一种可能:是原来线程1*读取到1,1+1=2 ,然后线程1*缓存被刷新刷新(其他线程启用内存屏障把2刷给你)被刷成2。

第二种可能:是原来线程1*读取到1,1+1=2 这步操作在寄存器中,无法同步,然后线程1*自增的值写入,变成2。

都是错的!

 

https://www.cnblogs.com/dolphin0520/p/3920373.html#!comments

 

 

我来说一下吧,很多人的解释就是错误的,线程2写完内存,到线程1去加1之前,线程1确实是会发现缓存行失效然后重新读取,照作者说的这个顺序并不会造成不一致的问题


我来总结一下吧,真正造成不一致的是这样的顺序:线程1读取Inc的值,然后对Inc+1,然后线程1被阻塞。线程2读取Inc的值,对Inc加1,然后写回给Inc,此时volatile起作用了!这个值立即被写回主内存,并导致其它线程的Inc变量的缓存行失效,这时候线程1的Inc变量缓存失效了!接下来线程1继续执行,将Inc的值写回。
也就是说,线程1中断的地方是在加1完成写回之前!不是作者写的读取完成加1之前!这样才会出现只加了一次的问题!

 

volatile原子性的最优解释(看了30多篇文章最终解惑)_第1张图片

 

mov    0xc(%r10),%r8d ; Load

inc    %r8d           ; Increment
<----------------------------------这个时候切换线程,你奈我何?

mov    %r8d,0xc(%r10) ; Store

<----------------------------------这个时候切换线程,你奈我何?

lock addl $0x0,(%rsp) ; StoreLoad Barrier

 

你可能感兴趣的:(volatile原子性的最优解释(看了30多篇文章最终解惑))