了解 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
也将如此。这就是栅栏的作用。
我想了解 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
也将如此。这就是栅栏的作用。