Jef*_*ery 6 c++ atomic memory-barriers
我正在阅读这篇文章编译时内存排序,其中说:
事实上,大多数函数调用都充当编译器屏障,无论它们是否包含自己的编译器屏障。这不包括内联函数、使用 pure 属性声明的函数以及使用链接时代码生成的情况。除了这些情况,对外部函数的调用甚至比编译器屏障更强,因为编译器不知道函数的副作用是什么。
这是一个真实的声明吗?想想这个样本——
std::atomic_bool flag = false;
int value = 0;
void th1 () { // running in thread 1
value = 1;
// use atomic & release to prevent above sentence being reordered below
flag.store(true, std::memory_order_release);
}
void th2 () { // running in thread 2
// use atomic & acquire to prevent asset(..) being reordered above
while (!flag.load(std::memory_order_acquire)) {}
assert (value == 1); // should never fail!
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以删除原子但替换为函数调用 -
bool flag = false;
int value = 0;
void writeflag () {
flag = true;
}
void readflag () {
while (!flag) {}
}
void th1 () {
value = 1;
writeflag(); // would function call prevent reordering?
}
void th2 () {
readflag(); // would function call prevent reordering?
assert (value == 1); // would this fail???
}
Run Code Online (Sandbox Code Playgroud)
任何的想法?
编译器屏障与内存屏障不同。编译器屏障阻止编译器移动代码穿过屏障。内存屏障(宽松地说)可防止硬件跨屏障移动读写操作。对于原子来说,两者都需要,并且还需要确保读取或写入时值不会被破坏。
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |