如何将std::string放入boost::lockfree::queue(或备选方案)
how to put std::string into boost::lockfree::queue (or alternative)?
我正在尝试将std::string
s放入boost::lockfree::queue
s中,以便我的线程可以用新数据相互更新。
当我尝试使用boost::lockfree::queue<std::string> updated_data;
时,g++
会说:
在"class boost::lockfree::queue>"的实例化中:
错误:静态断言失败:(boost::has_trivial_structor::value)
错误:静态断言失败:(boost::has_trivial_assign::value)
我已经大致了解了这些错误的含义,但我不希望自己解决这个问题,因为我几乎是c++的新手。
有没有其他方法可以在使用lockfree
的线程之间传递文本数据?如果没有,请告诉我如何将std::string
放入boost::lockfree::queue
中。
boost::lockfree::queue
文档明确指出,所包含的itemm必须具有std::string
没有的琐碎的副本赋值和析构函数。
如果你有一个生产者和一个消费者,你可以使用spsc_queue
(http://www.boost.org/doc/libs/1_54_0/doc/html/boost/lockfree/spsc_queue.html)这只需要默认的可构建性和可复制性。
如果您有多个生产者或消费者,那么您将被一个正常的锁定队列(或一个不使用动态分配的自定义字符串)卡住。
我不希望自己解决这个问题,因为我几乎是c++的新手。
然后我不得不想,你为什么要搞一些事情,比如无封锁排队。
有没有其他方法可以在使用
lockfree
的线程之间传递文本数据?
是的,您可以只存储一个指向队列中数据的std::string*
指针,因为指针是一种琐碎的类型,因此在队列中是允许的。等效地,您可以存储reference_wrapper<std::string>
。这样做的问题是,你需要将字符串存储在其他地方,以便能够指向它们,因此,现在您所做的只是将问题转移到其他地方(例如,您可以在每个线程中维护一个字符串列表,并将指向外部托管字符串的指针存储在无锁队列中,但您不知道何时从每个线程列表中删除string
是安全的,这样它就会不断增长。)
我建议您使用一个简单的std::queue<std::string>
,并使用boost::mutex
和boost::condition_variable
进行自己的同步,或者找到线程安全(而不是无锁!)队列的现有实现。
如果将原始指针放入队列中,旧的std::strings
将被泄漏,因为当不再需要它们时,无法释放它们。这是因为没有办法在不锁定的情况下以线程安全的方式释放对象(除了一些技巧,如boost::lockfree::queue
不使用的危险指针)
由于我不太理解的技术原因,boost::lockfree::queue
需要一个平凡的赋值运算符和一个平凡析构函数,这意味着你的对象不能是也不能包含任何必须在其析构函数中释放内存的数据类型,比如std::string
。
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- C++11 中不同类型的对象的 std::array 的替代方案
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 如何将std::string放入boost::lockfree::queue(或备选方案)