C ++の静的メンバ変数の初期化スレッドは、安全ですか?
-
21-09-2019 - |
質問
は、次のリソースによると、C ++(特別のVisual C ++)で静的変数の初期化はスレッドセーフではありませんスコープ。しかし、グローバル静的変数は安全です。
mutex化ですか なし スレッドセーフな静的変数
http://blogs.msdn.com/oldnewthing/アーカイブ/ 2004/03/08 / 85901.aspxする だから、静的メンバ変数をスレッドセーフ? 事前に感謝します!class TestClass
{
public:
static MyClass m_instance;
}
Myclass TestClass::m_instance;
解決
これ以上のすべての静的変数の他の種類ではなく、スコープの対グローバル対関数スコープの静的変数の問題だ。
唯一のアクティブなスレッドがあるがすべての非関数スコープの静的変数は、main()の前に構成されています。関数スコープの静的変数は、それを含む関数が呼び出された最初の時間を構築しています。標準では、関数が複数のスレッドで呼び出されたとき、関数レベルの静力学が構築されているかの質問に沈黙しています。ただし、すべての実装は私が保証スレッドの安全性への用途で(2回-確認フラグ付き)コンストラクタの周りにロックを働いてきます。
他のヒント
はい(*)。グローバル静が初期化されている場合は、そこの周りに1つのスレッドのみで、すべてのコンストラクタは、それに呼ばれています。これはしかし、関数の静的には当てはまりません。
(*)一つは、おそらく世界的な静は、スレッドセーフではありませんコンストラクタのいくつかのスレッドを作成し、これらのスレッドにいくつかの初期段階のスケジュールを設定することによって行うことができます。この場合、通常のスレッドの安全規則が適用されます。