对原子结构和指针的误解

Mat*_*ton 15 c++ struct pointers atomic

我的第一个问题是:有没有办法访问atomic<struct>对象中struct的成员?例如,我得到编译器错误:

struct std::atomic<node>’ has no member named ‘data’ a.data = 0; 
Run Code Online (Sandbox Code Playgroud)

在这一部分

struct node{
  int data;
  node* next;
};

int main(){
  atomic<node> a;
  a.data = 0;
}
Run Code Online (Sandbox Code Playgroud)

我可以通过创建一个像这样的临时节点来解决它:

  atomic<node> a;
  node temp;
  temp.data = 0;
  a.store(temp);
Run Code Online (Sandbox Code Playgroud)

但这似乎并不优雅.

第二个问题是,如果我有一个指向原子对象的指针怎么办?反正有没有直接访问节点的成员?显然以下不编译,如何将其更改为在b的节点值中存储0?

atomic<node> b = new node;
b->data = 0;
Run Code Online (Sandbox Code Playgroud)

这是我发现的一个解决方案,但同样,有更优雅的方式吗?

atomic<node> *b;
node temp;
temp.data = 0;
b->store(&temp);
Run Code Online (Sandbox Code Playgroud)

最后,atomic<node*>和之间有什么区别atomic<node>*

das*_*ght 11

这[解决方法]似乎并不优雅.

std::atomic<T>不能使任意操作原子:只支持加载和存储数据.这就是为什么你的"解决方法"实际上是处理原子对象的方法:你node以任何你喜欢的方式准备新值,然后以原子方式将它设置为atomic<node>变量.

如果我有一个指向原子对象的指针怎么办?反正有没有直接访问节点的成员?

通过指针访问节点的内容也不是原子的:因为std::atomic<T>可以保证只加载和存储它的值是原子的,所以它不允许你在T没有明确复制的情况下访问其成员.这是一件好事,因为它可以防止代码的读者得到错误的印象,即对T内部的访问在某种程度上是原子的.

之间有什么区别atomic<node*>atomic<node>*

在第一种情况下,原子对象存储一个指针,该指针可以原子方式访问(即,您可以原子地将此指针重新指向新节点).在第二种情况下,原子对象存储可以原子方式访问的值,这意味着您可以node原子地读取和写入整个值.