[英]Is there a function to load a non-atomic value atomically?
在 C++20 中,我们可以这样写:
double x;
double x_value = std::atomic_ref(x).load();
有没有同样效果的function?
我试过std::atomic_load
但似乎没有非原子对象的重载。
当然,不可移植的是 GNU C __atomic_load_n(&x, __ATOMIC_SEQ_CST)
__atomic
builtin 。
我很确定您在 ISO C++ 中找不到需要double *
或double &
的 function 。
可能需要一个std::atomic_ref<double> *
或引用,我没有检查,但我认为atomic_ref
的意图是在需要它的 function 内免费构建。
如果您想要这样的 function,请编写自己的构造 + 使用atomic_ref
。 它将全部内联到编译器上的__atomic_load_n
,无论如何atomic
在引擎盖下使用它。
但是请确保像这样声明您的全局, 以确保与atomic_ref
一起使用是安全+高效的。 将 atomic_ref 带到未充分对齐的 object 是 UB(我认为),因此atomic_ref
构造函数可以简单地假设您使用的 object 与atomic<T>
需要的对齐方式相同。
alignas (std::atomic_ref<double>::required_alignment) double x;
在实践中,这只会成为 8 字节原始类型的问题,例如 32 位目标上的double
内部结构,但类似struct { char c[8]; }
如果您不要求struct { char c[8]; }
,实际上可能不会自然对齐。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.