可以安全地提升::无锁::堆栈接受字符串指针
Can boost::lockfree::stack accept string pointers safely?
我发现将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 必须有一个简单的析构函数
-
缺少的文档是 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:无锁并发数据结构,以防你想玩弄其中一些算法。我认为该库的作者一直在与 Boost 开发人员就为 Boost 提出libcds
进行积极对话,但由于专利问题,它可能没有发生。
- 如何使用堆栈将字符串输入拉伸 k 次
- 带有模板的字符串堆栈?
- 在堆或堆栈上分配的动态创建的字符串 - C
- GCC C++堆栈上的字符串
- JNI、C++在堆栈中推送字符串
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 无法创建栅格堆栈,因为我无法连接字符串(dir_name + 文件名)
- 如何在 C++03 中没有重复代码的情况下在堆栈上创建一个非常量 C 字符串数组?
- 为什么字符串不会在堆栈中推送或弹出
- 我如何转换一个基于动态的,基于指针的int堆栈,以便将其打印成字符串
- 我在 36603 以上输入的任何数组大小时都会返回"堆栈溢出"错误。如何使字符串能够捕获整个.txt文件?
- 使用堆栈将字符串格式的十进制转换为双精度
- 查看使用堆栈是否相等的两个字符串
- C#到C代码P/调用多个std:字符串声明导致堆栈损坏
- palindrome功能(字符串,堆栈,队列)
- 堆栈上的 Const C 字符串
- 使用堆栈测试字符串中的x和y是否相等
- 将字符串放入堆栈C++时出错
- 如何将字符串推入堆栈
- C++ 堆栈字符串流函数返回整数与 ASCII