26

次のリソースによると、C++ (特に Visual C++) では、スコープ付きの静的変数の初期化はスレッド セーフではありません。ただし、グローバルな静的変数は安全です。

ミューテックスなしのスレッドセーフな静的変数?

http://blogs.msdn.com/oldnewthing/archive/2004/03/08/85901.aspx

では、静的メンバー変数を使用した次のコードはスレッドセーフですか?

class TestClass
{
public:
   static MyClass m_instance;
}

Myclass TestClass::m_instance;

前もって感謝します!

4

2 に答える 2

37

それは、スコープとグローバルではなく、関数スコープの静的変数と他のすべての種類の静的変数の問題です。

非関数スコープの静的変数はすべて main() の前に構築されますが、アクティブなスレッドは 1 つだけです。関数スコープの静的変数は、それを含む関数が初めて呼び出されたときに構築されます。標準は、関数が複数のスレッドで呼び出されたときに関数レベルの静的がどのように構築されるかという問題について沈黙しています。ただし、私が扱ったすべての実装では、コンストラクターの周りにロックを使用して (2 回チェックされるフラグを使用)、スレッドの安全性を保証しています。

于 2009-12-26T08:35:32.803 に答える
4

はい(*)。グローバルな静的が初期化されると、スレッドは 1 つだけになり、すべてのコンストラクターがそのスレッドで呼び出されます。ただし、これは関数の静的には当てはまりません。

(*) いくつかのコンストラクターでスレッドを作成し、これらのスレッドでいくつかの初期化ステージをスケジュールすることで、グローバルな静的をスレッドセーフでなくすることができます。この場合、通常のスレッド セーフ規則が適用されます。

于 2009-12-26T08:26:56.567 に答える