Tagged Zeiger für lockFree Liste in C

Ich versuche, markierte Zeiger für die Behandlung der sperrenfreien Operationen in einer Liste zu verwenden, um zu verhindern, dass Compare-and-Swap (CAS) ausgeführt wird, wenn während dieser Transaktion ein anderer Thread in der Liste ausgeführt wird. Meine Knotenstruktur und mein CAS sehen folgendermaßen aus:

struct node {
    unsigned long key;
    unsigned long val;
    struct node * next;
};

static inline bool CAS(std::atomic<node*> node, struct node* oldNode, struct node* newNode)
{
    node.compare_exchange_strong(oldNode, newNode, std::memory_order_seq_cst);
}

Ich habe einige Methoden zum Setzen und Prüfen dieser Zeiger gefunden, aber mir ist nicht klar, wie sie funktionieren. Dies sind die Methoden zum Setzen und Überprüfen der Maske.

__inline struct node* setTagMask(struct node* p, int MASK_BIT)
{
    return (struct node*) ((uintptr_t)p | MASK_BIT);
}

__inline bool isMaskFlagSet(struct node* p)
{
    return ((uintptr_t)p & MASK_BIT) != 0;
}

So was mir unklar ist, ist zum Beispiel in der setTagMask, wenn ich es auf meiner Liste verwende, dann werden alle Verweise auf seinen Wert und das nächste Element ebenfalls gelöscht.

Kann mir jemand erklären, wie ich diese Bits richtig setzen kann, damit die anderen Elemente der Liste gleich bleiben?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage