【发布时间】:2013-11-29 05:22:15
【问题描述】:
我目前正在做一个需要实现无锁链表的课程作业。我的每个节点的结构本质上是:
class Node {
std::shared_ptr<Node> next;
long long key;
}
我需要以某种方式在“下一个”指针中嵌入额外的数据位。我不能使用额外的布尔字段,因为“下一个”指针需要使用 compare_exchange_strong() 自动更新。我还必须使用 std::shared_ptr 来实现其垃圾收集能力;在无锁数据结构上执行内存回收超出了我们目前在课程中学习的范围。
如果我使用的是普通的旧指针,我可以使用位操作运算符来“旋转”指针的高位,但这显然行不通,因为一旦我旋转该位,指针就会指向无效内存位置,当赋值运算符试图访问控制块时,会导致分段冲突。
任何人都可以就我如何实现这一点提供任何见解吗?
哦,对于那些好奇的人,我在 Linux 系统上使用 g++-4.8.2。
【问题讨论】:
-
您可以在自定义删除器中嵌入信息。
-
你知道我在哪里可以找到这样的例子吗?
-
@DyP 删除器是每个指向的对象,而不是每个共享的指针,所以我想这是完全不同的。
-
@DanielFrey:但是那个自定义删除器肯定会去除导致问题的额外位。我看到的主要问题是“twiddled”指针可能会获得自己的独立引用计数。
-
我不清楚你是如何使用
compare_exchange_strong和shared_ptr
标签: c++ c++11 bit-manipulation shared-ptr