2010-11-05 44 views
7

可能重复:
Is the C++ STL std::set thread-safe?
Thread safety for STL queue正在使用std :: deque或std :: priority_queue线程安全吗?

我猜测它是不是,我只是想确认一下。 含义2线程使用相同 std :: deque使用std::deque::push_backpush_front在同一时间。

同样的问题也适用于std::priority_queue和功能std::priority_queue::pushstd::priority_queue::pop ..

是这些容器线程安全的?或者我应该亲自将其编程为线程安全的?

Tnx很多。

+0

可能的重复 - http:// stackoverflow。com/questions/1362110/is-the-c-stl-stdset-thread-safe – DumbCoder 2010-11-05 12:46:29

回答

10

斯科特迈尔的Effective STL项目12.有关于STL容器

多的读者都是安全的线程安全现实的期望。多个线程可能会同时读取单个容器的内容,并且这可以正常工作。当然,在阅读过程中不得有任何作家在容器上作出行动。

不同容器的多个作者是安全的。多个线程可能会同时写入不同的容器。

当涉及到线程安全和STL容器时,您可以希望实现一个库实现,允许一个容器上的多个阅读器和多个阅读器在不同容器上的多个阅读器。你不能希望库去消除手动并发控制的需要,你根本不能依赖任何线程支持。

+5

“希望”不是我希望在期望线程安全时看到的一个词;) – 2014-03-06 10:52:55

+1

这个引用可能与哲学相关,没有任何实用性的暗示。据我所知,任何stl deque实现我知道这也是不正确的RE阅读和写作。 – easytiger 2014-05-21 09:41:04

2

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

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

1

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

push_back和push_front不会使std :: deque中的迭代器无效,所以你可能有2个线程,一个推到后面,一个推到前面,你可能会逃脱,但我会保持警惕,因为实现者不能保证它能够线程安全,并且可以执行一些不是线程安全的内部内容。

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

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

相关问题