/ / Pourquoi ne puis-je pas accéder au champ suivant de cette structure? - c ++, concurrence, sans verrouillage, stdatomic

Pourquoi ne puis-je pas accéder au champ suivant de cette structure? - c ++, concomitance, sans verrou, stdatomic

J'essaie d'implémenter une structure de données simultanée, comme ci-dessous.

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;
};

J'accède à la variable de l’objet comme ceci:

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

Mais j'obtiens l'erreur suivante:

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

Quelqu'un peut-il s'il vous plaît indiquer où cela est faux?

Réponses:

0 pour la réponse № 1

Je pense que vous "avez accidentellement interverti l'ordre du .load() et le next des champs. Tu as

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

au lieu de

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

Ceci dit "charge, atomiquement, le pointeur nommé ptret regardez son champ suivant, "alors que ce que vous aviez dit auparavant" next champ de l'objet atomique nommé ptrpuis appelez le load fonction sur ce pointeur.

Indépendamment, si le type de temp est Node, alors il n'y a pas listhead domaine à parler de. Vouliez-vous dire pour temp être un NodeList?

Enfin, comme il s’agit d’un code C ++, vous n'avez pas besoin de préfixer tous les noms de vos types de structure struct quand vous les utilisez. Vous pouvez, par exemple, réécrire

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

comme

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

0 pour la réponse № 2

Utilise ton NodeList struct au lieu de votre Node struct.