我有一个std :: vector< ...>这是在两个线程中共享的。
他们都调用了vec-> size();
这可以成为竞争条件的来源吗?我希望不是因为vec-> size()是const。
谢谢!
答案 0 :(得分:5)
如果您只是致电 vec->size()
,那么您就是安全的。但这有点难以置信。一旦你调用任何更改方法,例如push_back
,竞赛可能会导致错误的大小。
答案 1 :(得分:1)
可能不是。问题不在于vec-> size(),它也在所有其他函数中。
考虑一下:vector :: size()通常直接从成员计算,例如: .end
- .begin
。现在一个线程上的push_back会发生什么?它显然会通过成员影响大小。它改变了记忆。但没有记忆障碍。其他内核上的其他线程只会看到旧内存。因此,当他们拨打size()
时,将使用旧值计算。
一个明显的例外是在创建线程后向量没有改变大小。线程永远不会有过时的信息。