2012-01-27 99 views
2

「通過調用啓動,將未啓動的線程轉換爲運行狀態。」 [來自msdn ThreadState enumeration docs從未啓動到正在運行的線程的時序

究竟何時線程從Unstarted轉換到運行?

如果我實例化一個線程並調用Start,線程實際上移動到Running之前是否有延遲?如果實例化線程在啓動之後立即調用Join,那麼是否有風險會在未啓動狀態下捕獲新線程?

+0

我相信你的問題的第一行會爲你解答。 – 2012-01-27 10:58:55

+0

據說它通過調用Start來進行轉換,它並沒有說它在Start返回之前發生了...... – 2012-01-27 11:05:49

回答

1
  1. 其狀態變爲RunningStart()方法返回之前,儘管它可能還沒有(而且經常不會)做了任何實際的工作,因爲它可能還沒有得到任何核心時間。大多數情況下,我們可以認爲跑步已經足夠了(就像大多數時候我們可以認爲「我們有6個線程在運行」一樣,如果我們只有4個內核,顯然我們只需要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主題後最終::開始被調用。 Thread不能保證在ThreadState.Running中,但它可以在例如ThreadState.WaitSleepJoin中,如果它在檢查狀態之前阻塞了互斥鎖。

雖然導致加入問題的唯一ThreadState是ThreadState.Unstarted,但是在Start之後調用Join是安全的,只要Start不會引發異常。

相關問題