可能重复:
Is the C++ STL std::set thread-safe?
Thread safety for STL queue
我猜它不是,我只想确定。
意思是同时使用std::deque::push_back
或push_front
使用相同 std :: deque的2个主题。
同样的问题适用于std::priority_queue
以及函数std::priority_queue::push
和std::priority_queue::pop
..
这些容器是否是线程安全的?或者我应该亲自编程它是线程安全的?
Tnx很多。
答案 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的生产者/消费者队列时,我允许生产者一次推送多个项目,并且消费者扫描整个队列进行处理。