std::thread的join和detach

C++中的thread對象通常來說表達了執行的線程(thread of execution),這是一個OS或者平臺的概念。

thread一旦創建,就開始執行,並且與創建它的線程有一定的關係。

thread創建後,需要在調用線程中需要指明是join還是detach,否則會發生錯誤。

1、當thread::join()函數被調用後,調用它的線程會被block,直到線程的執行被完成。基本上,這是一種可以用來知道一個線程已結束的機制。當thread::join()返回時,OS的執行的線程已經完成,C++線程對象可以被銷燬。

2、當thread::detach()函數被調用後,執行的線程從線程對象中被分離,已不再被一個線程對象所表達--這是兩個獨立的事情。C++線程對象可以被銷燬,同時OS執行的線程可以繼續。如果程序想要知道執行的線程何時結束,就需要一些其它的機制。join()函數在那個thread對象上不能再被調用,因爲它已經不再和一個執行的線程相關聯。

在std::thread的析構函數中,std::terminate會被調用如果:

  • 線程沒有被Joined(用t.join())
  • 線程也沒有被detached(用t.detach())

thread::detach()後:沒有直接方法與線程通信,不可能wait了,不可能有任何thread object指向這個線程。線程變成了後臺進程(孤兒進程),在Linux將由init接管,在c++中由庫接管。若不確定一個線程是否有thread object指向它,那麼請先用thread::joinable()檢測後再thread::detach()就想前面代碼中的joinable檢測一樣。
考慮一個情形:通常我們在word中編輯文件A時,點擊"新建"按鈕後會出現新的窗口繼續編輯文件B。這裏A和B是相對獨立的,A"新建"相當於開啓一個線程去供B使用,其後A馬上detach這個線程。代碼如下:
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章