「通過調用啓動,將未啓動的線程轉換爲運行狀態。」 [來自msdn ThreadState enumeration docs。從未啓動到正在運行的線程的時序
究竟何時線程從Unstarted轉換到運行?
如果我實例化一個線程並調用Start,線程實際上移動到Running之前是否有延遲?如果實例化線程在啓動之後立即調用Join,那麼是否有風險會在未啓動狀態下捕獲新線程?
「通過調用啓動,將未啓動的線程轉換爲運行狀態。」 [來自msdn ThreadState enumeration docs。從未啓動到正在運行的線程的時序
究竟何時線程從Unstarted轉換到運行?
如果我實例化一個線程並調用Start,線程實際上移動到Running之前是否有延遲?如果實例化線程在啓動之後立即調用Join,那麼是否有風險會在未啓動狀態下捕獲新線程?
其狀態變爲Running
的Start()
方法返回之前,儘管它可能還沒有(而且經常不會)做了任何實際的工作,因爲它可能還沒有得到任何核心時間。大多數情況下,我們可以認爲跑步已經足夠了(就像大多數時候我們可以認爲「我們有6個線程在運行」一樣,如果我們只有4個內核,顯然我們只需要4實際上在做某事)。也可能是,當你到達調用線程的下一條指令時,它是WaitSleepJoin
甚至Stopped
,但它不會是Unstarted
。
即使在Start()
(儘管這很少有用)之後的下一個聲明中,呼叫Join()
也是非常安全的。
對Start
的調用不是異步的,所以該方法將在線程啓動時返回。我已經在幾個示例應用程序中完成了這項工作,然後立即致電Join
從未造成任何問題。
爲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不會引發異常。
我相信你的問題的第一行會爲你解答。 – 2012-01-27 10:58:55
據說它通過調用Start來進行轉換,它並沒有說它在Start返回之前發生了...... – 2012-01-27 11:05:49