可以安全地提升::无锁::堆栈接受字符串指针

Can boost::lockfree::stack accept string pointers safely?

本文关键字:堆栈 字符串 指针 无锁 安全      更新时间:2023-10-16

我发现将string指针传递到boost::lockfree::queue会导致内存泄漏,因为string指针无法完全释放。

boost::lockfree::stack的情况是一样的吗?

boost::lockfree::stack的要求是:

  • T 必须具有复制构造函数

如果不能使用常规string指针,是否有其他方法可以将string放入boost::lockfree::stack中?

常规string

当我尝试这个

boost::lockfree::stack<string> my_stack(128);

我收到这些错误

 BOOST_STATIC_ASSERT(boost::has_trivial_assign<T>::value);
 BOOST_STATIC_ASSERT(boost::has_trivial_destructor<T>::value);

这对我来说似乎很奇怪,可能是因为我缺乏经验,因为这些实际上是对现在奇怪的没有文档的boost::lockfree::queue的要求

  • T 必须具有复制构造函数
  • T 必须有一个简单的赋值运算符
  • T 必须有一个简单的析构函数
  1. 缺少的文档是 Doxygen 错误,文档页面从 MACRO :(获取名称,它在这里:http://www.boost.org/doc/libs/1_55_0/doc/html/boost/lockfree/BOOST_NO_CXX1_idp100289128.html

  2. 事实上,堆栈似乎与队列具有相同的元素类型要求,尽管文档没有提到它。更糟糕的是,似乎boost::string_ref也没有保留 POD。

所以我的建议是将指针存储到不可变字符串对象的"池"中,并在释放队列时释放池。这样,您只需管理队列的生存期,以使内存消耗不会失控。

在某些方面,这类似于实现穷人的 GC,是的,它将强制吞吐量定期延迟以重新初始化队列;公平地说,无锁内存管理领域很常见,正如 Boost Lockfree 文档所述,现有的大多数"可行"内存回收方案都获得了专利。

你可以看看libcds:无锁并发数据结构,以防你想玩弄其中一些算法。我认为该库的作者一直在与 Boost 开发人员就为 Boost 提出libcds进行积极对话,但由于专利问题,它可能没有发生。