我正在尝试为自组织列表开发无锁解决方案。我最近发现了标记指针,并认为它对我有用。
我的节点结构如下:
typedef struct node {
unsigned long val;
struct node * next;
} node_t;
我想使用原子库中的 compare_exchange_strong 函数
std::atomic<node_t*> nodeAtomic;
nodeAtomic.store(node, std::memory_order_seq_cst);
nodeAtomic.compare_exchange_strong(nodeNew, node, std::memory_order_seq_cst)
例如,如果一个线程正在一个节点上工作,那么 cas 不应该通过,因为这个低位将不匹配。
我的问题是:
- 如何在不丢失节点具有的引用(next & val)的情况下设置此位?
- 我怎样才能把它放回去?