编译器跨静音边界重新排序的代码

Code reordering by compiler across mutex boundaries

本文关键字:排序 代码 新排序 边界 编译器      更新时间:2023-10-16

考虑以下代码:

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具有此行为,还有其他一些编译器。