我有一个线程推送到STL列表和从列表弹出前面的另一个线程。在这种情况下,我是否需要使用互斥锁锁定列表?
答案 0 :(得分:11)
如果多个线程访问单个容器,并且至少有一个线程可能写入,则用户负责确保在容器访问期间线程之间的互斥。
由于你的两个线程都修改了列表,我想你必须锁定它。
答案 1 :(得分:3)
大多数STL实现都是线程安全的,你可以从几个线程访问列表类型的多个实例而不需要锁定。但是当你访问列表的同一个实例时,你必须锁定。
查看更多信息:thread safty in sgi stl
答案 2 :(得分:1)
可能。这些操作不够简单,不够原子化,因此如果实现显式执行必要的锁定,它们只是线程安全的。
但是,C ++标准没有指定这些操作是否应该是线程安全的,因此由各个实现来决定。检查文档。 (或者让我们知道您正在使用哪种实现方式)
答案 3 :(得分:1)
无法保证STL实现是线程安全的,并且因为它会降低性能,我猜大多数都不是。你绝对应该使用互斥锁。
答案 4 :(得分:1)
由于stl pop / push操作是AFAIK非原子操作,因此您必须使用互斥锁。