繁体   English   中英

是否有 function 以原子方式加载非原子值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM