是否有以原子方式加载非原子值的函数?
Is there a function to load a non-atomic value atomically?
在C++20中我们可以这样写:
double x;
double x_value = std::atomic_ref(x).load();
有没有同样效果的函数?
我试过std::atomic_load
,但似乎没有非原子对象的重载。
当然不可移植,还有 GNU C __atomic_load_n(&x, __ATOMIC_SEQ_CST)
__atomic
builtin.
我很确定您在 ISO C++ 中找不到接受 double *
或 double &
.
的函数
可能需要 std::atomic_ref<double> *
或引用,我没有检查,但我认为 atomic_ref
的目的是在需要它的函数中免费即时构建.
如果您想要这样的函数,请编写您自己的构造 + 使用 atomic_ref
。它将全部内联到编译器上的 __atomic_load_n
,其中 atomic
无论如何都在后台使用它。
但是一定要像这样声明你的全局,to make sure it's safe + efficient to use with atomic_ref
。将 atomic_ref 用于未充分对齐的对象是 UB(我认为),因此 atomic_ref
构造函数可以简单地假设您使用的对象与 atomic<T>
需要对齐是。
alignas (std::atomic_ref<double>::required_alignment) double x;
实际上,这只会成为 8 字节原始类型的问题,例如 32 位目标上的结构内部的 double
,但是如果 struct { char c[8]; }
之类的东西在实践中可能不会自然对齐你不要求对齐。
在C++20中我们可以这样写:
double x;
double x_value = std::atomic_ref(x).load();
有没有同样效果的函数?
我试过std::atomic_load
,但似乎没有非原子对象的重载。
当然不可移植,还有 GNU C __atomic_load_n(&x, __ATOMIC_SEQ_CST)
__atomic
builtin.
我很确定您在 ISO C++ 中找不到接受 double *
或 double &
.
可能需要 std::atomic_ref<double> *
或引用,我没有检查,但我认为 atomic_ref
的目的是在需要它的函数中免费即时构建.
如果您想要这样的函数,请编写您自己的构造 + 使用 atomic_ref
。它将全部内联到编译器上的 __atomic_load_n
,其中 atomic
无论如何都在后台使用它。
但是一定要像这样声明你的全局,to make sure it's safe + efficient to use with atomic_ref
。将 atomic_ref 用于未充分对齐的对象是 UB(我认为),因此 atomic_ref
构造函数可以简单地假设您使用的对象与 atomic<T>
需要对齐是。
alignas (std::atomic_ref<double>::required_alignment) double x;
实际上,这只会成为 8 字节原始类型的问题,例如 32 位目标上的结构内部的 double
,但是如果 struct { char c[8]; }
之类的东西在实践中可能不会自然对齐你不要求对齐。