在MacOSX上,使用g ++,std :: vector .size()线程是否安全?

时间:2010-03-04 08:12:36

标签: c++ macos

我有一个std :: vector< ...>这是在两个线程中共享的。

他们都调用了vec-> size();

这可以成为竞争条件的来源吗?我希望不是因为vec-> size()是const。

谢谢!

2 个答案:

答案 0 :(得分:5)

如果您只是致电 vec->size(),那么您就是安全的。但这有点难以置信。一旦你调用任何更改方法,例如push_back,竞赛可能会导致错误的大小。

答案 1 :(得分:1)

可能不是。问题不在于vec-> size(),它也在所有其他函数中。

考虑一下:vector :: size()通常直接从成员计算,例如: .end - .begin。现在一个线程上的push_back会发生什么?它显然会通过成员影响大小。它改变了记忆。但没有记忆障碍。其他内核上的其他线程只会看到旧内存。因此,当他们拨打size()时,将使用旧值计算。

一个明显的例外是在创建线程后向量没有改变大小。线程永远不会有过时的信息。