可能重复:
STL 向量和线程安全
一个简单的例子:
struct A {
int a;
void set_a (int x)
{
... // line-1
... // line-2
this->a = x; // line-3
}
};
...
vector<A> v; // somewhere
假设,v
在线程 1 和线程 2 中共享。v.set_a()
总是在线程 1 和v.push_back()
线程 2 中调用。所以不存在线程安全问题。
以下事件序列会发生什么:
- 线程 1 调用
v.set_a()
- 在第 3 行之前,线程 2 调整向量 (
push_back()
,resize()
,...)的大小 - 当前位置没有足够的连续内存,
v
必须移动到其他位置
它会导致未定义的行为吗?如果是,那么这种情况下最优雅的解决方案是什么?