boost :: lockfree :: stack可以安全地接受字符串指针吗?

时间:2014-04-20 05:51:00

标签: c++ string boost stack lock-free

我发现将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 个答案:

答案 0 :(得分:1)

  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。

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

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

    如果您想要使用其中一些算法,可以查看 libcds: Lock-free Concurrent Datastructures 。我认为该图书馆的作者一直在与Boost开发人员就Boost提出libcds进行积极对话,并且由于专利问题,它很可能没有发生。