_ReadWriteBarrier如何在调用树中传播?

时间:2010-01-28 17:19:13

标签: c++ multithreading visual-c++ memory-barriers

我正在documentation查看Visual C ++的_ReadWriteBarrier内在函数中的这段文字:

  

在以前版本的Visual C ++中   编译器,_ReadWriteBarrier和   _WriteBarrier函数仅在本地强制执行且不受影响   用于调用树。在视觉中   C ++ 2005及更高版本,这些函数   一直强制执行   树。

我理解屏障在函数中的作用,但“调用树”似乎意味着调用函数foo()的函数bar()可以知道bar()是否包含障碍与否。在VC2005中实际改变了什么来启用这个...调用约定/ ABI,编译器完成的一些全局分析,或者是什么?

1 个答案:

答案 0 :(得分:1)

MS文档从来都不是很好,这个就是一个很好的例子。 _ReadWriteBarrier有两个部分:

  1. 告诉CPU进行内存屏障(即mfence),
  2. 告诉编译器不要围绕屏障进行优化。
  3. 我怀疑调用树部分是指#2。即:

    int x = 0;
    
    void foo()
    {
       x = 7;
       _ReadWriteBarrier();
       x = 8;
    }
    

    没有屏障,编译器可以完全删除x = 7。有了屏障,它就会停留。 现在,调用 foo?

    的函数怎么样?
    void bar()
    {
       x = 3;  // optimized away?
       foo();
       x = 4;
    }
    

    我认为过去x = 3可能已被优化掉了(编译器很难判断是否允许),但现在它会正确地保留x = 3指令。

    我想。