天天看點

C++11 線程對象建立後既不join()也不detach()的後果線程對象狀态狀态轉換線程對象析構參考資料

線程對象狀态

C++11中,線程對象(

std::thread

)建立後,有兩種狀态:

  • joinable
  • nonjoinable

那麼分别在什麼情況下處于上面兩種狀态呢?

狀态轉換

線程對象通過預設構造函數構造後狀态為

nonjoinable

;線程對象通過

有參構造函數

建立後狀态為

joinable

joinable狀态

的線程對象被調用

join()或者detach()

會變成

nonjoinable狀态

C++11 線程對象建立後既不join()也不detach()的後果線程對象狀态狀态轉換線程對象析構參考資料
題外話:推薦一個線上畫流程圖的網站:ProcessOn

線程對象析構

線程對象析構時,會判斷線程的狀态。如果線程處于

nonjoinable狀态

時,會調用

terminate()函數

直接令程式退出。

VisualStudio中的實作版本為:

~thread() _NOEXCEPT
{	// clean up
	if (joinable())
		_XSTD terminate();
}
           

也就是說,建立一個可運作(建立時傳入線程函數)的線程對象後,必須對該線程對象進行處理,要麼調用join(),要麼調用detach(),否則線程對象析構時程式将直接退出。

參考資料

C++在聲明一個線程之後不寫join()函數或者detach()函數,程式就會報錯,這是為什麼呢?

C++11多線程:thread頭檔案