我猜不是,我只是想确定一下。意味着 2 个线程同时使用or使用相同的std::deque 。std::deque::push_back
push_front
同样的问题适用std::priority_queue
于功能std::priority_queue::push
和std::priority_queue::pop
..
这些容器是线程安全的吗?或者我应该亲自将其编程为线程安全的?
Tnx 很多。
我猜不是,我只是想确定一下。意味着 2 个线程同时使用or使用相同的std::deque 。std::deque::push_back
push_front
同样的问题适用std::priority_queue
于功能std::priority_queue::push
和std::priority_queue::pop
..
这些容器是线程安全的吗?或者我应该亲自将其编程为线程安全的?
Tnx 很多。
来自 Scott Myer 的 Effective STL Item 12。对 STL 容器的线程安全有现实的期望
多个阅读器是安全的。多个线程可以同时读取单个容器的内容,这将正常工作。自然,在读取过程中不能有任何写入者作用于容器。
不同容器的多个写入器是安全的。多个线程可以同时写入不同的容器。
当谈到线程安全和 STL 容器时,您可以希望有一个库实现,它允许一个容器上的多个读取器和不同容器上的多个写入器。您不能希望库消除对手动并发控制的需要,并且您根本不能依赖任何线程支持。
STL 不为线程安全提供任何保证。从多个线程修改同一个容器时尤其如此。
您正在使用的 STL 的实现可能会提供一定程度的线程安全,但您需要查看实现的文档。
当您说它们是线程安全的时,大概您的意思是您可以在多个线程中使用它们而不必锁定任何东西。
从理论上讲,您可能有 2 个线程,一个推到后面,一个推到前面,您可能会侥幸逃脱,尽管我会保持警惕,因为实现者无法保证在迭代器变为线程时使其成为线程安全如果 push_back 的实现使用“end”而 push_front 的实现使用“begin”,则在任一端插入无效,这将在另一个线程的调用中失效,并且可能会炸毁你。
std::priority_queue 几乎可以肯定不能同时在两个线程中使用,大概是用于生产者/消费者线程,一个推一个弹出,你需要先锁定。
我发现当我基于 std::deque 编写一个生产者/消费者队列时,我允许生产者一次推送多个项目,而消费者可以扫描整个队列进行处理。这意味着每个批量插入只有一个锁,因此减少了您需要锁定的次数。