Punteros etiquetados para lockFree list en C

Estoy tratando de usar punteros etiquetados para manejar las operaciones sin bloqueo en una lista, a fin de bloquear el paso de comparar e intercambiar (CAS) si algún otro hilo operaba en la lista durante esta transacción. Mi estructura de nodo y CAS se ven así:

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

Encontré algunos métodos para configurar y verificar estos punteros, pero no me queda claro cómo funcionan, estos son los métodos para configurar la máscara y verificarla.

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

Entonces, lo que no está claro para mí es, por ejemplo, en setTagMask, si lo uso en mi lista, eliminará todas sus referencias a su valor y al siguiente elemento también.

¿Alguien puede explicarme cómo puedo configurar correctamente estos bits para que los otros elementos de la lista sigan siendo los mismos?

Respuestas a la pregunta(1)

Su respuesta a la pregunta