12

可能的重复:
C++ STL std::set 线程安全吗?
STL 队列的线程安全

我猜不是,我只是想确定一下。意味着 2 个线程同时使用or使用相同的std::deque 。std::deque::push_backpush_front

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

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

Tnx 很多。

4

3 回答 3

17

来自 Scott Myer 的 Effective STL Item 12。对 STL 容器的线程安全有现实的期望

多个阅读器是安全的。多个线程可以同时读取单个容器的内容,这将正常工作。自然,在读取过程中不能有任何写入者作用于容器。

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

当谈到线程安全和 STL 容器时,您可以希望有一个库实现,它允许一个容器上的多个读取器和不同容器上的多个写入器。您不能希望库消除对手动并发控制的需要,并且您根本不能依赖任何线程支持。

于 2010-11-05T12:52:30.327 回答
3

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

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

于 2010-11-05T12:48:32.837 回答
1

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

从理论上讲,您可能有 2 个线程,一个推到后面,一个推到前面,您可能会侥幸逃脱,尽管我会保持警惕,因为实现者无法保证在迭代器变为线程时使其成为线程安全如果 push_back 的实现使用“end”而 push_front 的实现使用“begin”,则在任一端插入无效,这将在另一个线程的调用中失效,并且可能会炸毁你。

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

我发现当我基于 std::deque 编写一个生产者/消费者队列时,我允许生产者一次推送多个项目,而消费者可以扫描整个队列进行处理。这意味着每个批量插入只有一个锁,因此减少了您需要锁定的次数。

于 2010-11-05T12:53:07.643 回答