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

标签 c++ string boost stack lock-free

我发现将 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

最佳答案

  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: Lock-free Concurrent Datastructures 如果您想玩弄其中一些算法。我认为该库的作者一直在与 Boost 开发人员就为 Boost 提议 libcds 进行积极对话,但由于专利问题,它可能没有发生。

关于c++ - boost::lockfree::stack 可以安全地接受字符串指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23178949/

相关文章:

C++ std::string 和字符串

c++ - 将字符串和整数散列在一起?

c++ - 在 for 循环中反转?

c++ - 使用 boost visitor 在类型之间进行转换

c++ - Boost 序列化仅适用于 main?继续说 "has no member named ‘serialize’ “当我在其他对象中使用时

c++ - 使用指向彼此的指针初始化 const struct 实例

c++ - 部分覆盖虚函数

c++ - 如何在 C++ 中创建 Lua 表,并将其传递给 Lua 函数?

android - 从 R.string 获取 TextView 字符串 ID

c++ - 向我介绍 boost::exception