重複の可能性:
STL ベクトルとスレッドセーフ
簡単な例:
struct A {
int a;
void set_a (int x)
{
... // line-1
... // line-2
this->a = x; // line-3
}
};
...
vector<A> v; // somewhere
がスレッドv1 とスレッド 2 で共有されているとします。v.set_a()常にスレッド 1 とv.push_back()スレッド 2 で呼び出されます。したがって、スレッドセーフの問題はありません。
以下の一連のイベントで何が起こるか:
- スレッド 1 呼び出し
v.set_a() - 行 3 の前に、スレッド 2 はベクトル (
push_back()、resize()、...)のサイズを変更します。 - 現在の場所に十分な連続メモリがない
vため、別の場所に移動する必要があります
未定義の動作につながりますか? はいの場合、そのようなシナリオの最もエレガントなソリューションは何ですか?