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原子地读取和写入整个值.