ローカル配列とスレッドとのやりとりのためのC++ 98とC++ 11のメモリモデルは何ですか?C++ローカル変数とスレッド(thread_localではない)
私はグローバル変数と静的変数に関連するC++ 11 thread_localキーワードを参照ないよ。
代わりに、コンパイル時に割り当てられた配列のスレッドの動作が保証されているかどうかを調べたいと思います。コンパイル時には、私は "int array [100]"を意味します。これはnew []キーワードを使った割り当てとは異なります。私はの静的な変数を意味しません。
たとえば、のは、私は、次の構造体/クラスを持っているとしましょう:
struct xyz { int array[100]; };
と、次の関数:
void fn(int x) {
xyz dog;
for(int i=0; i<100; ++i) { dog.array[i] = x; }
// do something else with dog.array, eg. call another function with dog as parameter
}
は、複数のスレッドからFN()を呼び出すことは安全ですか? C++メモリモデルは、すべてのローカル非静的変数と配列がスタックに割り当てられ、各スレッドに独自のスタックが割り当てられているようです。これは本当ですか(つまり、これは公式に標準の一部ですか)?
ありがとうございました。これは明示的にC++ 11標準で書かれていますか? – mtall
@mtall:間接的に。関数本体のすべての非静的変数は、関数スコープの一部であり、自動保存期間を持ちます。これは 'std :: thread :: thread(F &&、Args && ...)'によって呼び出される関数にも当てはまります。すべてを一緒に困惑させたい場合は、4つのセクションを読まなければなりません。 – Zeta
最後に、 'fn'を呼び出すたびに' xyz'のインスタンスが作成されます。したがって、2つのスレッドが同時に 'fn'を呼び出すと、両方のスレッドはスレッドセーフである' xyz'の独自のインスタンスを作成して変更します。 – TianyuZhu