【问题标题】:Is using std::deque or std::priority_queue thread-safe? [duplicate]是否使用 std::deque 或 std::priority_queue 线程安全? [复制]
【发布时间】:2011-05-05 14:10:51
【问题描述】:

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

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

std::priority_queue 和函数 std::priority_queue::pushstd::priority_queue::pop.. 也有同样的问题。

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

Tnx 很多。

【问题讨论】:

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


【解决方案1】:

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

理论上你可能有 2 个线程,一个推到后面,一个推到前面,你可能会侥幸逃脱,尽管我会很谨慎,因为实现者不能保证它是线程安全的由于迭代器在任一端的插入变得无效,如果 push_back 的实现使用“end”而 push_front 的实现使用“begin”,这将在另一个线程的调用中失效,并且可能会炸毁你。

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • “希望”不是我喜欢在线程安全期望中看到的词;)
    • 这句话可能与哲学相关,但没有任何实用性的暗示。据我所知,对于任何 stl deque 实现,我知道它也是不正确的 RE 读写。
    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 2017-04-21
    • 2018-07-14
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多