2012-01-27 10 views
2

"起動していないスレッドは、起動を呼び出して実行状態に移行しました。 [msdn ThreadState enumeration docsから。スレッドが起動していない状態から実行中に遷移するタイミング

スレッドが起動していない状態から実行中に移行するのはいつですか?

スレッドをインスタンス化して「開始」を呼び出すと、実際にスレッドが実行中に移動するまでに遅延がありますか?インスタンス化するスレッドがStartの直後にJoinを呼び出すと、新しいスレッドをUnstarted状態で捕捉する危険性がありますか?

+0

私はあなたの質問の最初の行がこれに答えると信じています。 –

+0

Startと呼ぶことで移行したと言われていますが、Startが戻る前に起こっているとは言えません... –

答えて

1
  1. それはまだコア時間を与えられていないかもしれないとして、それはまだ(とかなり頻繁にはありません)、実際の仕事をしていないかもしれないけれども、その状態が、Start()メソッドが戻る前にRunningになります。たいていの場合、トレッドが走っていると考えることができるという事実は十分です(ちょうど私たちが4つのコアしか持っていないと「我々は6つのスレッドが走っている」と考えることができます)実際に何かしている4)。また、呼び出しスレッドの次の命令に行くときには、WaitSleepJoin、さらにはStoppedだが、それはUnstartedではないだろう。

  2. Start()の後の次の文でも、Join()に電話するのは完全に安全です(これはめったに役に立ちませんが)。

1

Startの呼び出しは非同期ではないため、メソッドはスレッドを開始した状態で返します。私はいくつかのサンプルアプリケーションでこれをやったことがあり、すぐにJoinと呼んでも問題は起こりませんでした。

1

ThreadState.Unstartedのドキュメントは、言い換えれば

Unstarted The Thread::Start method has not been invoked on the thread. 

を述べ、いや、あなたはスレッド後Thread.Unstartedで終わることができません::スタートと呼ばれてきました。スレッドはThreadState.Runningにあることは保証されていませんが、状態をチェックする前にMutexでブロックすると、たとえばThreadState.WaitSleepJoinにある可能性があります。

Joinで問題を引き起こす唯一のThreadStateはThreadState.Unstartedなので、Joinの呼び出しはStartの直後でも安全です.Startは例外をスローしません。

関連する問題