是否有以原子方式加载非原子值的函数?

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]; } 之类的东西在实践中可能不会自然对齐你不要求对齐。