我正在尝试将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
。