我发现将 string
指针传递给 boost::lockfree::queue
会导致内存泄漏,因为 string
指针无法完全释放。
boost::lockfree::stack
的情况是否相同? ?
boost::lockfree::stack
的要求是:
- T must have a copy constructor
如果不能使用常规的 string
指针,是否有任何其他方法可以将 string
放入 boost::lockfree::stack
?
常规字符串
当我尝试这个时
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 must have a copy constructor
- T must have a trivial assignment operator
- T must have a trivial destructor
最佳答案
缺少的文档是 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
进行积极对话,但由于专利问题,它可能没有发生。
关于c++ - boost::lockfree::stack 可以安全地接受字符串指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23178949/