gpt4 book ai didi

c++ - 对原子结构和指针的误解

转载 作者:IT老高 更新时间:2023-10-28 22:28:44 25 4
gpt4 key购买 nike

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

struct std::atomic<node>’ has no member named ‘data’ a.data = 0; 

在这个片段中

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

int main(){
atomic<node> a;
a.data = 0;
}

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

  atomic<node> a;
node temp;
temp.data = 0;
a.store(temp);

但这似乎不是很优雅。

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

atomic<node> b = new node;
b->data = 0;

这是我找到的解决方案,但同样,有没有更优雅的方法来做到这一点?

atomic<node> *b;
node temp;
temp.data = 0;
b->store(&temp);

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

最佳答案

this [workaround] doesn't seem very elegant.

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

what if I have a pointer to an atomic object? Is there anyway to access the members of the node directly?

通过指针访问节点的内容也不是原子的:因为 std::atomic<T>可以保证只加载和存储它的值是原子的,它不允许你访问T的成员,而不制作明确的拷贝。这是一件好事,因为它可以防止代码的读者产生错误的印象,即访问 T的内部结构在某种程度上是原子的。

what is the difference between atomic<node*> and atomic<node>*

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

关于c++ - 对原子结构和指针的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27069103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com