2015-09-12 13 views
5

私はthis questionに触発されたいくつかの研究をしていましたが、同様の問題に対する提案されたソリューションのいくつかが静的変数の初期化時にミューテックスオブジェクトを作成したことに気付きました。このようなmutexは、それを作成したスレッドがアプリケーションの存続期間中も生き残っている場合にのみ、必要に応じて動作します。静的変数は特定のスレッドで初期化されていますか?

静的変数はプロセスのメインスレッドによって初期化されているようですが、メインの関数が終了したときだけプロセスのメインスレッドが終了するという合理的な推測のようです(おそらくプログラマの制御下にあります)。

しかし、これらはどちらもC#言語標準によって実際に保証されていますか?

PS:私はWindowsスレッドではなく、.NETスレッドについて説明しています。

+1

スレッドに関するあなたの前提は正しくありません。メインスレッドは、他のスレッドが終了する前に終了することができます。それについて[ここ](http://stackoverflow.com/questions/31128935/c-sharp-child-thread-is-still-working-even-main-thread-exit)に関する質問がありました。 – GolezTrol

+0

@GolezTrol:ありがとう。この例では、main関数が終了するだけでメインスレッドが終了するため、この文脈ではそれ自体が致命的ではないと私は考えています。これはプログラマの制御下にあります。したがって、mutexが解放されるまでプログラマが主関数を終了しないようにすることができます。しかし、言語標準が主な機能が果たされるまで主スレッドが終了しないことを保証するかどうかという疑問はまだ残っています。 (それに応じて更新された質問) –

答えて

3

C#では、静的変数は、クラスの最初の読み込み時にクラスローダーによって初期化されます。これは、クラスを最初に参照したスレッドがどんなものであっても興味深い人工物を持っています。

メインスレッドは管理スレッドであることが保証されていないので、メインスレッドの後のライブラリではそれを識別できる保証はありません。私はプログラムを書いたことがあります。それには、ネイティブの初期化後にメインスレッドがなくて、それが実行できることを証明するだけです。

+0

私は疑いました。ありがとう。さらに読んだことは、メインスレッドではなくUIスレッドについて考えていたはずであることを示唆しています。 [私はその答えを投稿しました](http://stackoverflow.com/a/32545751/886887)あなたがすばやくそれを見て、私が明らかで恐ろしい間違いをしたかどうかを知らせる時間があれば私はそれを感謝します。 :-) –

+0

UIスレッドは別の誤称です。 N UIスレッドを持つことができます。ここでは0> = N>(膨大な数)です。 – Joshua

+0

私は 'Application.Current.Dispatcher'で指定されたものを意味します。それは定数ですね。私はそれを "プライマリUIスレッド"と呼んでいましたが、すべてのドキュメンテーションは単に "UIスレッド"と呼ばれるように見えるので、私はそれに固執しなければならないと考えました... –

関連する問題