C++11 具有原子属性的结构体定义

标签 c++11 struct thread-safety atomic definition

在 C++11 中,我有一个包含很多属性的结构,如下所示:

#include <atomic>
struct Foo {
  int x;
  int y;
  // ...
  // LOTS of primitive type attributes, followed by...
  // ...
  std::atomic_bool bar;
}

我想像这样定义一个实例:

bool bar_value = true;
Foo my_foo = {/*attribute values*/, bar_value};

但是,atomic_bool 抛出“使用已删除函数”错误,因为我认为原子上不允许复制构造。除了编写构造函数或单独分配每个值之外,有什么办法可以解决这个问题吗?

仅仅因为它的许多属性之一是特殊情况,就必须以特殊的方式处理这个相对平庸的结构,这似乎很不方便。

更新:

  • 有人接受吗?我一直在四处寻找,但似乎没有任何直接的方法来解决这个问题。

最佳答案

尝试将atomic_bool的初始化包装在它自己的初始值设定项列表中。它在 g++ 中对我有用 4.7 .

#include <atomic>
#include <iostream>

struct Foo
{
    int x;
    int y;
    std::atomic_bool bar;
};

int main(int, char**)
{
    Foo f1 = {1, 2, {true}};
    Foo f2 = {3, 4, {false}};

    std::cout << "f1 - " << f1.x << " " << f1.y << " "
              << (f1.bar.load()?"true":"false") << std::endl;
    std::cout << "f2 - " << f2.x << " " << f2.y << " "
              << (f2.bar.load()?"true":"false") << std::endl;
}

我得到以下输出:

$ g++ -std=c++11 test.cpp -o test && ./test
f1 - 1 2 true
f2 - 3 4 false

关于C++11 具有原子属性的结构体定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16702645/

相关文章:

c++ - 没有虚拟的多态行为

c++ - 为什么在 C++11 中取消了对逗号运算符在常量表达式中的限制?

c++ - 指针中的 constexpr 有区别吗

c++ - C++中的“expression must have class type”错误

c - 共享库局部变量线程安全吗?

Swift 原子 bool 值

c++ - Qt5:如何使用QProcess进行批处理

c - 读取结构中包含的 char 会导致访问冲突异常

c - 循环内的结构数组

perl - 将变量插入数组是线程安全操作吗?