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

时间:2014-01-23 07:40:21

标签: c++ boost queue containers boost-thread

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

我有一个制作人和一个或多个消费者。

4 个答案:

答案 0 :(得分:10)

如果一个或多个线程正在编写,则

std::queue不是线程安全的。并且它的接口不利于线程安全实现,因为它具有单独的方法,例如pop()size()empty(),这些方法必须在外部同步。

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

*搜索“并发队列C ++”应该会产生很多结果。我实现了一个非常简单的玩具here,其限制是仅使用标准C ++。另请参阅Anthony Williams的书 C ++并发行动以及他的博客。

答案 1 :(得分:2)

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

但是,如果您遇到作家线程饥饿,请查看boost::shared_mutex

答案 2 :(得分:1)

在boost 1.53中有一个锁定队列http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/queue.html,没有这样的互斥或smth。

答案 3 :(得分:0)

你必须保护它,例如在{em>每个操作上使用std::mutex。如果您还没有C ++ 11,Boost将是另一种选择。