C++ 对于生产者和多个消费者,std::queue是线程安全的吗
如何使队列线程安全?我需要推动/弹出/前/后并清除。boost中有类似的东西吗C++ 对于生产者和多个消费者,std::queue是线程安全的吗,c++,boost,queue,containers,boost-thread,C++,Boost,Queue,Containers,Boost Thread,如何使队列线程安全?我需要推动/弹出/前/后并清除。boost中有类似的东西吗 我有一个生产者和一个或多个消费者。您必须在每次操作中保护它,例如使用std::mutex。如果您还没有C++11,Boost将是另一种选择。std::queue在一个或多个线程正在写入时不是线程安全的。而且它的接口不利于线程安全的实现,因为它有单独的方法,如pop()、size()和empty(),这些方法必须在外部同步 一种常见的方法*是使用更简单的接口实现队列类型,并在内部使用锁定机制来提供同步 *搜索“并发队列
我有一个生产者和一个或多个消费者。您必须在每次操作中保护它,例如使用
std::mutex
。如果您还没有C++11,Boost将是另一种选择。std::queue
在一个或多个线程正在写入时不是线程安全的。而且它的接口不利于线程安全的实现,因为它有单独的方法,如pop()
、size()
和empty()
,这些方法必须在外部同步
一种常见的方法*是使用更简单的接口实现队列类型,并在内部使用锁定机制来提供同步
*搜索“并发队列C++”应该会产生许多结果。我实现了一个非常简单的玩具,其中的限制是只使用标准的C++。也请参阅Anthony Williams的《行动中的C++并发》以及他的博客。 < P>你必须保护对
boost::mutex
保护它。现在,如果您有多个读卡器和一个编写器线程,请查看boost::shared_lock
(用于读卡器)和boost::unique_lock
(用于编写器)
但是,如果您遇到编写器线程不足,请查看boost 1.53中的
boost::shared_mutex
有一个锁费队列,没有类似的互斥或smth。查看。您的标题会询问它们是否线程安全,但您的开场白会询问如何使它们安全。因此,您已经知道标题中问题的答案了。可能重复:C++11线程安全队列()这篇博文讨论了它:使用条件变量()实现线程安全队列()。这篇文章的作者是在操作中写C++并发的家伙。即使如此,也需要一些额外的同步(比如说,你想在弹出之前检查队列不是空的。这不是原子的,所以即使单独操作也会同步)。。我怀疑多个读卡器能否同时安全地读取队列。对于这个问题,我相信读者会从队列中弹出项目。pop操作修改队列,因此必须在队列上持有独占锁。在其他上下文中,“reader”一词用于表示不执行修改且只查看值的代码。如果在这个问题中,读卡器调用的是peek而不是pop,那么它们满足这个条件,共享锁也可以工作。@Jason,一个可能的解决方案是使用原子CAS机制的可变成员标志,该机制允许每个读卡器线程处理队列中的一个唯一项而不弹出,并有一个定期清理阶段(在专用锁下)可以帮助清理已处理的项目。感谢链接!非常好的解释。仅适用于POD等:(