c++ - 从 std::shared_ptr 窃取位

标签 c++ c++11 bit-manipulation shared-ptr

我目前正在处理一个类作业,我需要在其中实现一个无锁链表。我的每个节点的结构本质上是:

class Node {
    std::shared_ptr<Node> next;
    long long             key;
}

我需要以某种方式将额外的数据位嵌入到“下一个”指针中。我不能使用额外的 bool 字段,因为“下一个”指针需要使用 compare_exchange_strong() 自动更新。我还必须使用 std::shared_ptr 来实现其垃圾收集能力;在无锁数据结构上执行内存回收超出了我们目前在类(class)中学习的范围。

如果我使用的是一个普通的旧指针,我可以使用位操作运算符来“旋转”指针的高位,但显然这是行不通的,因为一旦我旋转了该位,指针就会指向一个无效的内存位置,当赋值运算符试图访问控制 block 时,会导致段冲突。

任何人都可以提供有关如何实现此目标的任何见解吗?

哦,对于那些好奇的人,我在 Linux 系统上使用 g++-4.8.2。

最佳答案

您似乎想在这里混合两种不同的东西。

在 shared_ptr 中干预指针并不是一个好主意。共享指针是线程安全的,但如果您使用原子操作,您可以自己完成。

不管怎样,之前建议的自定义删除器是这样完成的;

struct d { void operator()(foo* f){ delete f; } };

...然后您使用此创建一个 shared_ptr;

shared_ptr<bar> b(new bar, d());

...但为什么不先使用原子操作呢?

干杯!

关于c++ - 从 std::shared_ptr 窃取位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20007476/

相关文章:

c++登录系统 - 如何返回用户名?

c++ - grpc 服务中连接的简单线程安全 vector

c++ - C++模板编程中的Or语句

c - 使用位运算符的效率

c++ - 在 32 位字位模式中找到 "edges"

c++ - 更快的位读取?

c++ - 单声道嵌入: How to access type of a property in C/C++

c++ - MFC中如何设置控件在对话框中的初始位置?

C++ 读/写两个不同的文件(需要帮助理解要使用的语法)

c++ - 在静态断言和运行时错误之间自动选择