【问题标题】:Do I need to lock STL list with mutex in push_back pop_front scenario?我是否需要在 push_back pop_front 场景中使用互斥锁锁定 STL 列表?
【发布时间】:2009-02-05 11:54:16
【问题描述】:

我有一个线程推送到 STL 列表,另一个线程从列表中弹出。在这种情况下我需要用互斥锁锁定列表吗?

【问题讨论】:

    标签: c++ multithreading stl


    【解决方案1】:

    来自SGI's STL on Thread Safety

    如果多个线程访问单个容器,并且至少有一个线程可能写入,则用户负责确保容器访问期间线程之间的互斥。

    由于你的两个线程都修改了列表,我猜你必须锁定它。

    【讨论】:

    • SGI 的 STL 与 C++ 标准库中实现的 STL-alike 不同。后者没有提到并发或线程。 (还有许多其他差异,尽管这些在这里不相关)。但简而言之,您不能假设 SGI 所说的将适用于标准库
    【解决方案2】:

    大多数 STL 实现都是线程安全的,因为您可以从 多个线程 访问列表类型的 多个实例 而无需锁定。但是当您访问列表的同一实例时,您必须锁定。

    查看更多信息:thread safty in sgi stl

    【讨论】:

      【解决方案3】:

      大概吧。这些操作不够简单,不能成为原子操作,因此只有在实现显式执行必要的锁定时,它们才会是线程安全的。

      但是,C++ 标准并没有指定这些操作是否应该是线程安全的,因此由各个实现来决定。检查文档。 (或者让我们知道您正在使用哪种实现方式)

      【讨论】:

        【解决方案4】:

        无法保证 STL 实现是线程安全的,而且由于它会降低性能,我猜大多数都不是。您绝对应该使用互斥锁。

        【讨论】:

          【解决方案5】:

          由于 stl pop / push 操作是 AFAIK 非原子操作,因此您必须使用互斥锁。

          【讨论】:

            猜你喜欢
            • 2011-12-01
            • 2015-10-31
            • 1970-01-01
            • 1970-01-01
            • 2010-09-12
            • 2011-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多