我目前正在进行类分配,我需要实现一个无锁链接列表。我的每个节点的结构基本上都是:
class Node {
std::shared_ptr<Node> next;
long long key;
}
我需要以某种方式将一些额外的数据嵌入到“下一个”指针中。我不能使用额外的布尔字段,因为需要使用compare_exchange_strong()以原子方式更新“下一个”指针。我还必须使用std :: shared_ptr作为垃圾收集功能;在无锁数据结构上执行内存回收超出了我们迄今为止在本课程中学习的范围。
如果我使用普通的旧指针,我可以使用位操作操作符来“旋转”指针的高位,但显然这不起作用,因为一旦我旋转该位,指针指向无效内存位置,当赋值运算符尝试访问控制块时,它将导致分段违例。
任何人都可以提供有关如何实现这一目标的任何见解吗?
哦,对于那些好奇的人,我在Linux系统上使用g ++ - 4.8.2。
答案 0 :(得分:0)
好像你试图在这里混合两种不同的东西。
干扰shared_ptr中的指针不会让我觉得好主意。共享指针是线程安全的,但是如果使用原子操作,则可以自己完成。
无论如何,之前建议的自定义删除操作就像这样;
struct d { void operator()(foo* f){ delete f; } };
...然后使用;
创建一个带有此功能的shared_ptrshared_ptr<bar> b(new bar, d());
...但为什么不使用原子操作开始?
干杯!