【问题标题】:Is there a function to load a non-atomic value atomically?是否有以原子方式加载非原子值的功能?
【发布时间】:2020-07-01 05:57:06
【问题描述】:

在 C++20 中我们可以这样写:

double x;

double x_value = std::atomic_ref(x).load();

有没有相同效果的功能?

我尝试过std::atomic_load,但似乎没有非原子对象的重载。

【问题讨论】:

  • 当然是不可移植的,有 GNU C __atomic_load_n(&x, __ATOMIC_SEQ_CST)gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html。您是否正在寻找采用double* 的函数?我怀疑你会在 ISO C++20 中找到一个,但如果有一个需要 std::atomic_ref<double> * 或参考的 IDK。
  • @PeterCordes One 接受double*double&
  • @PeterCordes 您的评论实际上回答了我的问题。如果你想让它成为一个答案,我会接受它。

标签: c++ c++20 stdatomic


【解决方案1】:

当然,不可移植的是 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 字节原始类型的问题,例如 double 在 32 位目标上的结构内部,但如果您不要求,像 struct { char c[8]; } 这样的东西实际上可能不会自然对齐对齐。

【讨论】:

    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2021-05-28
    相关资源
    最近更新 更多