了解 std::atomic 内存障碍

Understanding std::atomic 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++ 函数的行为都是相同的吗?

不,但它等同于:

#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 synchronization" 或 "fence-atomic synchronization" 下的条件 here。虽然您没有对存储 a 设置任何限制,但它将在 memory_order_release 内,n 也将如此。这就是栅栏的作用。