编译器跨静音边界重新排序的代码
Code reordering by compiler across mutex boundaries
考虑以下代码:
int a = 0, b = 0;
boost::mutex m;
a++;
m.lock();
m.unlock();
b++;
锁做什么是他们告诉编译器"好吧,暂时忘记C 标准,我不在乎如果您严格遵循的话,它将允许什么优化。您必须重新排序任何内存访问权限跨越这个边界"。这是否意味着a++;
总是在b++;
之前发生?还是意味着,如果有语句s,则在锁之间,不要用a++
或b++
?
鲍姆·米特(Baum Mit Augen)的评论已经很好地回答了这个问题。
但是,如果" a"answers" b"是 global 变量,并声明为 volatile ,具体取决于编译器,则互在强加的内存屏障可能会保证该读取/写表达不会在边界上重新排序。
这意味着一个读" B"并发现其增加的线程,并且在执行类似的静音锁定以强加记忆屏障之后,并确保确保" A"读取" A"也修改了。
MSVC具有此行为,还有其他一些编译器。
相关文章:
- 无法在我的堆排序代码中找到错误.无法正确执行.C++
- 在实现合并排序代码时无法计算所有反转
- 我的C++合并排序代码不起作用。我在这里错过了什么?
- 我的选择排序代码是否存在导致它跳过数组中的元素的问题?
- 此气泡排序代码中的错误是什么?
- 合并排序代码中的分段错误
- 我的C++合并排序代码有什么问题?
- 添加气泡排序代码以排列列表
- 我写了一个快速的排序代码,逻辑似乎很正确,但是控制台上没有输出
- 当我使用此合并排序代码运行时,输出错误
- 我在合并排序代码中获取垃圾值
- 我的插入排序代码有问题
- C++合并排序代码中的隔离错误
- 为什么我的排序代码不起作用?
- 快速排序代码说明
- 合并排序代码 c++
- 由于优化而重新排序代码
- 在c中快速排序代码,在64位Windows机器上无法解释的行为
- 这个合并排序代码出了什么问题
- 将排序代码与数组合并,陷入合并,只需要一点点修正