線程對象狀态
C++11中,線程對象(
std::thread
)建立後,有兩種狀态:
- joinable
- nonjoinable
那麼分别在什麼情況下處于上面兩種狀态呢?
狀态轉換
線程對象通過預設構造函數構造後狀态為
nonjoinable
;線程對象通過
有參構造函數
建立後狀态為
joinable
。
joinable狀态
的線程對象被調用
join()或者detach()
會變成
nonjoinable狀态
。

題外話:推薦一個線上畫流程圖的網站:ProcessOn
線程對象析構
線程對象析構時,會判斷線程的狀态。如果線程處于
nonjoinable狀态
時,會調用
terminate()函數
直接令程式退出。
VisualStudio中的實作版本為:
~thread() _NOEXCEPT
{ // clean up
if (joinable())
_XSTD terminate();
}
也就是說,建立一個可運作(建立時傳入線程函數)的線程對象後,必須對該線程對象進行處理,要麼調用join(),要麼調用detach(),否則線程對象析構時程式将直接退出。
參考資料
C++在聲明一個線程之後不寫join()函數或者detach()函數,程式就會報錯,這是為什麼呢?
C++11多線程:thread頭檔案