日期:2014-05-16  浏览次数:20611 次

内存屏障与抢占
假设有两段程序
第一段
  Y = 0;
  X = 2;
  Y = 3
第二段  
  if(X == 2){
  temp = Y;
  }
在SMP情况下,假如两段代码同时在各自的cpu上运行。因为cpu的乱序执行的特性,第一段代码的三个赋值语句顺序可能是不定的。那么第二段代码执行后temp的值可能是0,也可能是3。
所以在这种情况下,需要对第一段代码要加内存屏障
第一段
  Y = 0;
  X = 2;
  smp_wmb();
  Y = 3;
这样就可以确保第二段代码执行后temp的值是3。  
但是我不明白的是,在单核情况下,smp_wmb()对cpu是没用的。如果发生这种情况,比如说,第一段代码乱序执行完后,这时
cpu切换到第二段代码运行。 岂不是第二段代码执行后temp的值可能是0,也可能是3,也是不确定的?????

不知道我把我想问的问题说明白没用,希望知道的人能指定一二,先谢过了。



 

------解决方案--------------------
wmb( ) 就是用于单cpu的,

像书上所说的一样,现有的intel的cpu是不会对写内存指令进行重新排序的,其实wmb宏是什么也不用做。
所以你可以保证任何时候 y=0 都会在y=3的前面运行的。
你看一下intel的手册吧,我记得有一章是专门讲这个的。