请考虑以下代码:
Recording API
他们告诉编译器的锁是什么?好吧,暂时忘记C ++标准,如果你严格遵守,那我就不在乎它会允许哪些优化。您不得重新排序跨越此边界的任何内存访问"。这是否意味着int a = 0, b = 0;
boost::mutex m;
a++;
m.lock();
m.unlock();
b++;
将始终发生在a++;
之前?或者是否意味着,如果在锁定之间存在声明,请不要使用b++;
或a++
重新排序?
答案 0 :(得分:0)
Baum mit Augen的评论已经很好地回答了这个问题。
然而,如果" a"和" b" 全局变量,并声明 volatile ,具体取决于编译器,互斥锁施加的内存屏障可能保证读/写表达式不会跨边界重新排序。
这意味着一个读取" b"并发现它已被增加,并且在此之后执行类似的互斥锁定以强加内存屏障,并最终读取" a",保证找到" a"也被修改了。
MSVC也有此行为,以及其他一些编译器。