11

我正在尝试将std::strings 放入boost::lockfree::queues 中,以便我的线程可以使用新数据相互更新。

当我尝试使用boost::lockfree::queue<std::string> updated_data;时,g++说:

在 'class boost::lockfree::queue >' 的实例化中:

错误:静态断言失败:(boost::has_trivial_destructor::value)

错误:静态断言失败:(boost::has_trivial_assign::value)

我已经大致了解了这些错误的含义,但我没有希望自己解决这个问题,因为我对 c++ 几乎是全新的。

有没有另一种方法可以在线程之间传递文本数据lockfree?如果没有,请告诉我如何std::string放入boost::lockfree::queue.

4

3 回答 3

10

文档清楚地说明了包含的boost::lockfree::queueitemm 必须有一个微不足道的复制分配和析构函数,而std::string没有。

如果你有一个生产者和一个消费者,你可以使用spsc_queuehttp://www.boost.org/doc/libs/1_54_0/doc/html/boost/lockfree/spsc_queue.html),它只需要默认的可构造性和可复制性。

如果您有多个生产者或消费者,您将被普通的锁定队列(或不使用动态分配的自定义字符串)卡住。

于 2013-07-03T15:57:32.090 回答
8

我没有希望自己解决这个问题,因为我对 c++ 几乎是全新的。

然后我不得不想知道你为什么要搞乱无锁队列之类的东西。

有没有另一种方法可以在线程之间传递文本数据lockfree

是的,您可以只std::string*在队列中存储一个指向数据的指针,因为指针是一种普通类型,因此在队列中是允许的。等效地,您可以存储一个reference_wrapper<std::string>. 问题是您需要将字符串存储在其他地方,以便能够指向它们,所以现在您所做的就是将问题移到其他地方(例如,您可以在每个线程中维护一个字符串列表, 并将指向外部管理的字符串的指针存储在无锁队列中,但是您不知道何时可以安全地string从每个线程列表中删除 a ,因此它会不断增长。)

我建议您使用一个简单的方法并使用std::queue<std::string>and 进行自己的同步boost::mutexboost::condition_variable或者找到一个线程安全(不是无锁!)队列的现有实现。

于 2013-07-03T16:00:05.663 回答
3

如果将原始指针放入队列中,旧指针std::strings将被泄露,因为在不再需要它们时无法释放它们。这是因为没有办法在不使用锁的情况下以线程安全的方式释放对象(除了一些技巧,如boost::lockfree::queue不使用的危险指针)

出于我不太了解的技术原因,boost::lockfree::queue需要一个简单的赋值运算符和一个简单的析构函数,这意味着您的对象不能也不包含任何必须在其析构函数中释放内存的数据类型,例如std::string.

于 2014-04-24T21:43:59.170 回答