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