C++ C+中的尺寸函数和线程安全性+;

C++ C+中的尺寸函数和线程安全性+;,c++,list,thread-safety,constants,C++,List,Thread Safety,Constants,我想知道大小函数(大小、长度等)是否是线程安全的?据我所知,他们通常只返回一些私人大小的成员。我真的怀疑他们会做任何计算。它们都标记为const,但它们是线程安全的吗?例如std::list::size 我有一个写的锁保护函数和另一个读的锁保护函数(也是锁保护的),但我想知道我的计数函数是否也应该是锁保护的?依我看,这似乎是在浪费响应时间。我不认为如果同时从列表中删除某个成员(尽可能相同),它可能会破坏任何迭代器或失败。不,它们不是线程安全的。标准容器根本不是线程安全的 然而,线程安全性是有限的

我想知道大小函数(大小、长度等)是否是线程安全的?据我所知,他们通常只返回一些私人大小的成员。我真的怀疑他们会做任何计算。它们都标记为const,但它们是线程安全的吗?例如std::list::size


我有一个写的锁保护函数和另一个读的锁保护函数(也是锁保护的),但我想知道我的计数函数是否也应该是锁保护的?依我看,这似乎是在浪费响应时间。我不认为如果同时从列表中删除某个成员(尽可能相同),它可能会破坏任何迭代器或失败。

不,它们不是线程安全的。标准容器根本不是线程安全的

然而,线程安全性是有限的:如果每个线程都访问不同的元素,并且在任何给定时间都没有两个不同的线程访问任何元素,那么就可以了。但是,任何改变容器本身的操作(插入、擦除)都不是线程安全的,必须同步。因此,迭代器和引用可能会失去其有效性,
size()
也会受到类似的影响


换句话说,如果您将所有变异容器的操作与不变异容器的操作分开,那么在不变异的情况下,您可以安全地从多个线程调用
size()

是的,它需要被锁保护。假设您的实现的
std::list::size
是32位值,但在您的平台上,32位读取不是原子的,它们需要2个16位读取。在这种情况下,第二个线程可能会在第一次读取发生后中断读取大小的第一个线程,更新大小变量,然后在第二次16位读取发生时,您可能会得到一个真正的大小混乱值。

count
正在读取。如果锁定其他读取操作,为什么不锁定
count
?是什么让它特别?标准容器“根本不是线程安全的,周期”的说法是非常误导的!它们提供了非常合理的线程安全形式。仅仅因为一些人希望有一种线程安全,他们可以在不关心色雷斯的情况下生活,同时获得所有好处,并不意味着他们不线程安全!事实上,人们甚至不理解访问一个原语值需要同步,这是线程问题的一部分。这解释了为什么它不是线程安全的。“谢谢你!”皮朱斯和凯雷克说,“答案完全矛盾。”。