我是否需要在push_back pop_front场景中使用互斥锁锁定STL列表?

时间:2009-02-05 11:54:17

标签: c++ multithreading stl

我有一个线程推送到STL列表和从列表弹出前面的另一个线程。在这种情况下,我是否需要使用互斥锁锁定列表?

5 个答案:

答案 0 :(得分:11)

来自SGI's STL on Thread Safety

  

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

可能。这些操作不够简单,不够原子化,因此如果实现显式执行必要的锁定,它们只是线程安全的。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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