是生产者和多个消费者的std :: queue线程安全

uni*_*kat 13 c++ queue containers boost boost-thread

如何使队列线程安全?我需要按/弹出/前/后清除.是什么类似的提升?

我有一个生产者和一个或多个消费者.

jua*_*nza 10

std::queue如果一个或多个线程正在写入,则不是线程安全的.并且它的接口不利于线程安全实现,因为它具有单独的方法,例如pop(),size()并且empty()必须在外部同步.

常见的方法*是实现具有更简单接口的队列类型,并在内部使用锁定机制来提供同步.

*搜索"并发队列C++"应该会产生很多结果.我在这里实现了一个非常简单的玩具,其限制是仅使用标准C++.另见Anthony Williams的书中的C++并发,以及他的博客.


小智 2

您必须保护对std::queue. 如果您使用升压,请使用 保护它boost::mutex。现在,如果您有多个读者和一个作者线程,请查看boost::shared_lock(对于读者)和boost::unique_lock(对于作者)。

但是,如果您遇到编写器线程饥饿的情况,请查看boost::shared_mutex.

  • 我怀疑多个读者能否同时安全地读取队列。对于这个问题,我相信读者会从队列中弹出项目。弹出操作会修改队列,因此必须持有队列的排他锁。在其他上下文中,“阅读器”一词用于表示不执行任何修改并且仅查看值的代码。如果在这个问题中读者调用的是 peek 而不是 pop,那么他们满足这个标准并且共享锁将起作用。 (2认同)