是使用std :: deque还是std :: priority_queue线程安全?

时间:2010-11-05 12:44:43

标签: c++ stl thread-safety priority-queue deque

  

可能重复:
  Is the C++ STL std::set thread-safe?
  Thread safety for STL queue

我猜它不是,我只想确定。 意思是同时使用std::deque::push_backpush_front使用相同 std :: deque的2个主题。

同样的问题适用于std::priority_queue以及函数std::priority_queue::pushstd::priority_queue::pop ..

这些容器是否是线程安全的?或者我应该亲自编程它是线程安全的?

Tnx很多。

3 个答案:

答案 0 :(得分:13)

来自Scott Myer的有效STL项目12.对STL容器的线程安全性有现实的期望

  

多个读者是安全的。多个线程可以同时读取单个容器的内容,这将正常工作。当然,在阅读过程中一定不能有任何作家对集装箱采取行动。

     

对不同容器的多个编写者是安全的。多个线程可以同时写入不同的容器。

     

说到安全线程和STL容器,你可以希望一个允许多个读者的库实现   在一个容器上和多个写入器上的单独容器上。你不能希望库不需要手动并发控制,你根本不能依赖任何线程支持。

答案 1 :(得分:3)

STL不为线程安全提供任何保证。从多个线程修改同一容器时尤其如此。

您正在使用的STL的实现可能提供一定程度的线程安全性,但您需要查看实现的文档。

答案 2 :(得分:1)

如果你说它们是线程安全的,大概你的意思是你可以在多线程中使用它们而不必锁定任何东西。

push_back和push_front不会使std :: deque中的迭代器失效,所以你可能有2个线程,一个推到后面,一个推到前面,你可能会逃脱它虽然我会警惕,因为实现者不保证使其线程安全,并且可以做一些非线程安全的内部事务。

std :: priority_queue几乎肯定不能在两个线程中一起使用,大概是生产者/消费者线程,一个推送和一个弹出,你需要先锁定。

我发现当我编写基于std :: deque的生产者/消费者队列时,我允许生产者一次推送多个项目,并且消费者扫描整个队列进行处理。