【问题标题】:Stealing bits from a std::shared_ptr从 std::shared_ptr 窃取位
【发布时间】: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_strongshared_ptr

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


【解决方案1】:

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

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

无论如何,之前建议的自定义删除器就是这样完成的;

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

...你创建一个 shared_ptr w/this using;

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

...但是为什么不使用原子操作开始呢?

干杯!

【讨论】:

  • 我想使用 shared_pointers 来获得内存管理的好处;您不必担心何时删除它们。然而,显然在 gcc-4.8.2 中它们不是 100% 线程安全的;在我的一个实现中,我遇到了非常奇怪的“调用纯虚函数”错误。我最终编写了自己的内存管理器,它使用危险指针来确定何时可以安全地重用数据元素。我还必须编写一个基于锁的方法,并且自定义内存管理器比使用共享指针快大约 300-400%...
  • 关于“纯虚函数”错误;有时当我从基类析构函数中调用虚函数时,我会明白这一点。有时我出于日志记录的原因在析构函数中放置了一个cout &lt;&lt; "Destroying: " &lt;&lt; *this,如果operator&lt;&lt; 包含虚函数调用...:/
猜你喜欢
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 2011-02-10
  • 2020-06-06
  • 2014-03-25
  • 2019-10-20
  • 1970-01-01
相关资源
最近更新 更多