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 № 1Je 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é ptr
et regardez son champ suivant, "alors que ce que vous aviez dit auparavant" next
champ de l'objet atomique nommé ptr
puis 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.