了解std :: atomic内存障碍

时间:2017-02-27 13:20:20

标签: c++ multithreading memory-barriers

我想了解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 ++函数的行为是否相等?

1 个答案:

答案 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也是如此。这就是围栏的作用。