[ThreadStatic] private static Foo _foo; public static Foo CurrentFoo { get { if (_foo == null) { _foo = new Foo(); } return _foo; } }
前のコードのスレッドは安全ですか?または、メソッドをロックする必要がありますか?これは[ThreadStatic]を初期化するスレッドセーフな方法ですか?
[ThreadStatic] private static Foo _foo; public static Foo CurrentFoo { get { if (_foo == null) { _foo = new Foo(); } return _foo; } }
前のコードのスレッドは安全ですか?または、メソッドをロックする必要がありますか?これは[ThreadStatic]を初期化するスレッドセーフな方法ですか?
ThreadStaticにスレッドごとに1つのコピーがある場合。したがって、定義上、スレッドセーフです。
[ThreadStatic]
は、スレッドローカルストレージ用のコンパイラ/言語魔法です。つまり、スレッドにバインドされているため、コンテキストスイッチがあっても他のスレッドが直接アクセスすることはできないため、問題はありません。
これは私の例の由来です。私はただ1つのスレッドが_foo == nullを取得する可能性があるかどうかを判断しようとしていますが、スレッドスイッチが発生し、ヌルではないにもかかわらず新しい_fooがnew'edを取得しますか? –
スレッド当たり1つの_fooなので、コンテキストスイッチは影響を与えません。 – Will