我想知道大小函数(大小,长度或其他)是否是线程安全的?根据我的理解,他们通常只返回一些私人会员。我真的怀疑他们做了任何计算。它们都被标记为const但是它们是线程安全的吗?例如 std :: list :: size ?
我有一个用于写入的锁保护功能和另一个用于读取的功能(也是锁定保护的)但是我想知道我的计数功能是否也应该受到锁保护? IMO,看起来浪费了响应时间。如果某个成员同时从列表中删除(尽可能相同),我认为它不会破坏任何迭代器或失败。
答案 0 :(得分:6)
是的,它需要通过锁保护。假设您的实现std::list::size
是32位值,但在您的平台上32位读取不是原子的,它们需要2个16位读取。在这种情况下,第二个线程可能会在第一次读取发生后中断读取大小的第一个线程,更新大小变量,然后在第二个16位读取发生时,您可能会得到一个真正的大小混乱值。 / p>
答案 1 :(得分:4)
不,它们不是线程安全的。标准容器根本不是线程安全的,期间。
但是线程安全性有限:如果每个线程都访问不同的元素,并且在任何给定时间没有任何元素被两个不同的线程访问,那就没问题了。但是,任何改变容器本身(插入,擦除)的操作都不是线程安全的,必须同步。因此,迭代器和引用可能会失去其有效性,size()
也会受到类似的影响。
换句话说,如果你将所有改变容器的操作与那些不改变容器的操作分开,那么当你没有改变时,可以从多个线程中安全地调用size()