thread執行緒的join和detach

2021-08-21 16:58:36 字數 1905 閱讀 9719

detach呼叫之後,目標執行緒就成為了守護執行緒,駐留後台執行,與之關聯的std::thread物件失去對目標執行緒的關聯,無法再通過std::thread物件取得該執行緒的控制權。當執行緒主函式執行完之後,執行緒就結束了,執行時庫負責清理與該執行緒相關的資源。

當乙個thread物件到達生命期終點而關聯執行緒還沒有結束時,則thread物件取消與執行緒之間的關聯,目標執行緒執行緒則變為分離執行緒繼續執行。

當呼叫join函式時,呼叫執行緒阻塞等待目標執行緒終止,然後**目標執行緒的資源。

以下為講解時間

執行緒狀態:

在乙個執行緒的生存期內,可以在多種狀態之間轉換,不同的作業系統可以實現不同的執行緒模型,定義許多不同的執行緒狀態,每個狀態還可以包含多個子狀態,但大體來說,如下幾種狀態是通用的:

1)就緒:參與排程,等待被執行,一旦被排程選中,立即開始執行

2)執行:占用cpu,正在執行中

3)休眠:暫不參與排程,等待特定事件發生

4)中止:已經執行完畢,等待**執行緒資源

執行緒環境:

執行緒存在於程序之中,程序內所有全域性資源對於內部每個執行緒都是可見的。

程序內典型全域性資源如下:

1)**區:這意味著當前程序空間內所有的可見的函式**,對於每個執行緒來說,也是可見的

2)靜態儲存區:全域性變數,靜態空間

3)動態儲存區:堆空間

執行緒內典型的區域性資源:

1)本地棧空間:存放本執行緒的函式呼叫棧,函式內部的區域性變數等

乙個程序發起後,會首先生成乙個預設的執行緒,通常稱這個執行緒為主執行緒,c/c++程式中,主線程就是通過main函式進入的執行緒,由主線程衍生的執行緒成為從執行緒,從執行緒也可以有自己的入口函式,相當於主線程的main函式,這個函式由使用者指定。通過thread建構函式中傳入函式指標實現,在指定執行緒入口函式時,也可以指定入口函式的引數。就像main函式有固定的格式要求一樣,執行緒的入口函式也可以有固定的格式要求,引數通常都是void*型別,返回型別根據協議的不同也不同,pthread中是void*,winapi中是unsigned int,而且都是全域性函式。

最常見的執行緒模型中,除主線程較為特殊之外,其他執行緒一旦被建立,相互之間就是對等關係,不存在隱含的層次關係。每個程序可建立的最大執行緒數由具體實現決定。

無論在windows中還是posix中,主線程和子執行緒的預設關係是:無論子執行緒執行完畢與否,一旦主線程執行完畢退出,所有子執行緒執行都會終止。這時整個程序結束或僵死,部分執行緒保持一種終止執行但還未銷毀的狀態,而程序必須在其所有執行緒銷毀後銷毀,這時程序處於僵死狀態。執行緒函式執行完畢退出,或以其他非常方式終止,執行緒進入終止態,但是為執行緒分配的系統資源不一定釋放,可能在系統重啟之前,一直都不能釋放,終止態的執行緒,仍舊作為乙個執行緒實體存在於作業系統中,什麼時候銷毀,取決於執行緒屬性。在這種情況下,主線程和子執行緒通常定義以下兩種關係:

1、可會合(joinable):這種關係下,主線程需要明確執行等待操作,在子執行緒結束後,主線程的等待操作執行完畢,子執行緒和主線程會合,這時主線程繼續執行等待操作之後的下一步操作。主線程必須會合可會合的子執行緒。在主線程的執行緒函式內部呼叫子執行緒物件的wait函式實現,即使子執行緒能夠在主線程之前執行完畢,進入終止態,也必須執行會合操作,否則,系統永遠不會主動銷毀執行緒,分配給該執行緒的系統資源也永遠不會釋放。

在任何乙個時間點上,執行緒是可結合(joinable)或者是可分離的(detached),乙個可結合的執行緒能夠被其他執行緒**資源和殺死,在被其他執行緒**之前,它的儲存器資源如棧,是不釋放的,相反,乙個分離的執行緒是不能被其他執行緒**或殺死的,它的儲存器資源在它終止時由系統自動釋放。

執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己,在預設的情況下,執行緒是非分離狀態的,這種情況下,原有的執行緒等待建立的執行緒結束,只有當pthread_join函式返回時,建立的執行緒才算終止,釋放自己占用的系統紫雲啊,而分離執行緒沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止了,馬上釋放系統資源。

Thread的join的用法(執行緒執行排序)

執行緒必須要先start,才能join,只有啟動了,才能對執行緒進行操作。如有乙個執行緒叫a,那麼請看以下示例 a.start 啟動a執行緒 a.join 邀請a執行緒先執行,本執行緒先暫停執行,等待a執行緒執行完後,主線程再接著往下執行 system.out.println ok 這句話,要等到a...

thread 中join 的用法

前段時間參加面試時,被乙個面試官問到thread中join方法用法,那會自己答得有點唐突吧,面試官對我的回答好像不是很滿意!1.首先來說說執行緒thread的join方法 join方法顧名思義 就是往執行緒中新增東西的 join方法可以用於臨時加入執行緒,乙個執行緒在運算過程中,如果滿足於條件,我們...

Thread 的join方法解釋

一 作用 thread類中的join方法的主要作用就是同步,它可以使得執行緒之間的並行執行變為序列執行。具體看 public class jointest class threadjointest extends thread override public void run 上面程式結果是先列印完...