Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于生产者和多个消费者,std::queue是线程安全的吗_C++_Boost_Queue_Containers_Boost Thread - Fatal编程技术网

C++ 对于生产者和多个消费者,std::queue是线程安全的吗

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(),这些方法必须在外部同步 一种常见的方法*是使用更简单的接口实现队列类型,并在内部使用锁定机制来提供同步 *搜索“并发队列

如何使队列线程安全?我需要推动/弹出/前/后并清除。boost中有类似的东西吗


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

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

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

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


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

< P>你必须保护对 STD::队列的访问。如果您正在使用boost,请使用
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等:(