为什么我不能访问此结构中的下一个字段?

时间:2017-09-21 13:13:22

标签: c++ concurrency lock-free stdatomic

我正在尝试实现并发数据结构,如下所示。

struct Node;                                               
struct NodeList;

struct NodeAtomic{
   struct Node* next;
};

struct NodeListAtomic{
    struct NodeList* next;
};

struct Node{
    atomic<struct NodeAtomic> ptr;
};

struct NodeList
{
    struct Node listhead;
    atomic<struct NodeListAtomic> ptr;
};

我正在访问对象的变量:

struct Node *temp;
temp->listhead.ptr.next.load();

但是我收到以下错误:

error: ‘struct std::atomic<NodeAtomic>’ has no member named ‘next’

有人可以指出这是错误的吗?

2 个答案:

答案 0 :(得分:0)

使用您的NodeList结构而不是Node结构。

答案 1 :(得分:0)

我认为你不小心改变了.load()next字段的顺序。

temp->listhead.ptr.next.load();

而不是

temp->listhead.ptr.load()->next;

这表示“以原子方式加载指向ptr的指针,并查看其下一个字段”,而您之前所说的“查看名为{{的原子对象的next字段” 1}},然后在该指针上调用ptr函数。

独立地,如果load的类型为temp,则表示没有Node字段。您的意思是listheadtemp吗?

最后,由于这是C ++代码,因此在使用它们时,不需要为结构类型的所有名称添加前缀NodeList。例如,您可以重写

struct

作为

struct NodeList
{
    struct Node listhead;
    atomic<struct NodeListAtomic> ptr;
};