如何使队列线程安全?我需要按/弹出/前/后清除。是什么类似的提升?
我有一个制作人和一个或多个消费者。
答案 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将是另一种选择。