在无锁数据结构中,解决ABA问题的一个流行方案是使用额外单调递增标签对指针进行标记。
struct aba {
void *ptr;
uint32_t tag;
};
然而,这种方法存在问题。它非常缓慢并且具有巨大的缓存问题。如果我放弃标签字段,我可以获得两倍的加速。但这是不安全的吗?
因此,我接下来尝试为64位平台准备的东西将位数填入ptr字段中。
struct aba {
uintptr __ptr;
};
uint32_t get_tag(struct aba aba) { return aba.__ptr >> 48U; }
但是有人告诉我,标签只使用16位是不安全的。我的新计划是使用指针对齐到高速缓存行来增加更多的标签位,但我想知道这是否可行。
如果这个计划行不通,我的下一个计划是使用Linux的MAP_32BIT
mmap
标志来分配数据,这样我只需要32位指针空间。
在无锁数据结构中,ABA标记需要多少位?