多執行緒原理實現

Mr_John_Liang發表於2013-06-03

執行緒狀態
在一個執行緒的生存期內,可以在多種狀態之間轉換。不同作業系統可以實現不同的執行緒模型,定義許多不同的執行緒狀態,每個狀

態還可以包含多個子狀態。但大體說來,如下幾種狀態是通用的:
       就緒:參與排程,等待被執行。一旦被排程選中,立即開始執行。
       執行:佔用CPU,正在執行中。
       休眠:暫不參與排程,等待特定事件發生。
       中止:已經執行完畢,等待回收執行緒資源(要注意,這個很容易誤解,後面解釋)。
執行緒環境
執行緒存在於程式之中。程式內所有全域性資源對於內部每個執行緒均是可見的。
程式內典型全域性資源有如下幾種:
       程式碼區。這意味著當前程式空間內所有可見的函式程式碼,對於每個執行緒來說也是可見的。
       靜態儲存區。全域性變數。靜態變數。
       動態儲存區。也就是堆空間。

執行緒內典型的區域性資源有:
   本地棧空間。存放本執行緒的函式呼叫棧,函式內部的區域性變數等。
   部分暫存器變數。例如本執行緒下一步要執行程式碼的指標偏移量。

可會合(joinable)。這種關係下,主執行緒需要明確執行等待操作。在子執行緒結束後,主執行緒的等待操作執行完畢,子執行緒

和主執行緒會合。這時主執行緒繼續執行等待操作之後的下一步操作。主執行緒必須會合可會合的子執行緒,Thread類中,這個操作通過

在主執行緒的執行緒函式內部呼叫子執行緒物件的wait()函式實現。這也就是上面加上三個wait()呼叫後顯示正確的原因。必須強調的

是,即使子執行緒能夠在主執行緒之前執行完畢,進入終止態,也必需顯示執行會合操作,否則,系統永遠不會主動銷燬執行緒,分配

給該執行緒的系統資源(執行緒id或控制程式碼,執行緒管理相關的系統資源)也永遠不會釋放。


相分離(detached)。顧名思義,這表示子執行緒無需和主執行緒會合,也就是相分離的。這種情況下,子執行緒一旦進入終止態

,系統立即銷燬執行緒,回收資源。無需在主執行緒內呼叫wait()實現會合。Thread類中,呼叫detach()使執行緒進入detached狀態。

這種方式常用線上程數較多的情況,有時讓主執行緒逐個等待子執行緒結束,或者讓主執行緒安排每個子執行緒結束的等待順序,是很困

難或者不可能的。所以在併發子執行緒較多的情況下,這種方式也會經常使用。
預設情況下,建立的執行緒都是可會合的。可會合的執行緒可以通過呼叫detach()方法變成相分離的執行緒。但反向則不行。

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/cute810326/archive/2009/08/06/4417976.aspx

相關文章