重複の可能性:
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
ため、別の場所に移動する必要があります
未定義の動作につながりますか? はいの場合、そのようなシナリオの最もエレガントなソリューションは何ですか?