编译器跨互斥边界重新排序代码

时间:2016-11-30 09:36:23

标签: c++ locking mutex

请考虑以下代码:

Recording API

他们告诉编译器的锁是什么?好吧,暂时忘记C ++标准,如果你严格遵守,那我就不在乎它会允许哪些优化。您不得重新排序跨越此边界的任何内存访问"。这是否意味着int a = 0, b = 0; boost::mutex m; a++; m.lock(); m.unlock(); b++; 将始终发生在a++;之前?或者是否意味着,如果在锁定之间存在声明,请不要使用b++;a++重新排序?

1 个答案:

答案 0 :(得分:0)

Baum mit Augen的评论已经很好地回答了这个问题。

然而,如果" a"和" b" 全局变量,并声明 volatile ,具体取决于编译器,互斥锁施加的内存屏障可能保证读/写表达式不会跨边界重新排序。

这意味着一个读取" b"并发现它已被增加,并且在此之后执行类似的互斥锁定以强加内存屏障,并最终读取" a",保证找到" a"也被修改了。

MSVC也有此行为,以及其他一些编译器。