我发现将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必须有一个简单的析构函数
答案 0 :(得分:1)
缺少的文档是Doxygen错误,文档页面从MACRO获取名称:(,它在这里:http://www.boost.org/doc/libs/1_55_0/doc/html/boost/lockfree/BOOST_NO_CXX1_idp100289128.html
实际上,堆栈似乎与队列具有相同的元素类型要求,尽管文档没有提及它。更糟糕的是,boost::string_ref
似乎还没有保留POD。
所以我的建议是将指针存储到不可变字符串对象的“池”中,并在释放队列时释放池。这样,您只需管理队列的生命周期,使内存消耗不会失控。
在某些方面,这类似于实现穷人的GC,是的,将强制定期延迟吞吐量以重新初始化队列;公平性在无锁内存管理领域是常见的,正如Boost Lockfree文档所述,现有的大多数“可行的”内存回收方案都已获得专利。
如果您想要使用其中一些算法,可以查看 libcds: Lock-free Concurrent Datastructures 。我认为该图书馆的作者一直在与Boost开发人员就Boost提出libcds
进行积极对话,并且由于专利问题,它很可能没有发生。