我想了解C ++中的内存障碍是如何工作的。 例如,我在这种情况下使用std :: atomic:
#include <iostream>
#include <atomic>
int main()
{
std::atomic<int> a;
int n = load();//returns 1 or other value written by other thread
a.store (n, std::memory_order_release);
}
上面的代码在语义上是否与下面的代码相同?
#include <iostream>
#include <atomic>
int main()
{
std::atomic<int> a;
int n = load();
std::atomic_thread_fence(std::memory_order_release);
n = 100;//assume assignment is atomic
}
如果我是对的,我可以确定所有可以接受内存障碍作为参数的C ++函数的行为是否相等?
答案 0 :(得分:1)
不,但它等同于:
#include <iostream>
#include <atomic>
int main()
{
std::atomic<int> a;
int n = load();
std::atomic_thread_fence(std::memory_order_release);
a.store (12345, std::memory_order_relaxed);
n=100;
}
(虽然价值与你在那里所做的不同)。 必须是围栏内的原子商店。检查“fence-fence同步”或“fence-atomic synchronization”下的条件here。虽然您没有设置存储a
的任何约束,但它会在memory_order_release
内,n
也是如此。这就是围栏的作用。