2016-05-03 85 views

回答

14

A C++ thread對象一般(但不總是)表示執行的線程,這是一個操作系統或平臺的概念。

當調用thread::join()時,調用線程將阻塞,直到執行線程完成。基本上,這是一個可以用來知道線程何時完成的機制。當thread::join()返回時,OS執行線程已完成,C++ thread對象可能被銷燬。

thread::detach()被調用時,執行的線程是「分離」從thread對象,並通過一個thread對象不再表示 - 它們是兩個獨立的東西。 C++ thread對象可以被銷燬,並且OS的執行線程可以繼續。如果程序需要知道該執行線程何時完成,則需要使用其他一些機制。 join()不能在該對象上調用,因爲它不再與執行的線程相關聯。

在仍然「可連接」的同時銷燬C++ thread對象被認爲是錯誤的。也就是說,爲了摧毀C++ thread對象,必須調用join()(或完成)或必須調用detach()。如果C++ thread對象在被銷燬時仍然可以連接,則會拋出異常。

其它一些方法,一個C++ thread對象將不能代表執行的線程(即,可以是不能加入。):

  • 默認構造thread對象不表示執行的線程,所以是不可連接。
  • 已經移動的線程將不再表示一個執行線程,因此不可連接。
3

join()不殺死線程。實際上它等到線程主函數返回。所以,如果你的線程的主要功能如下:

while (true) { 
} 

join()會永遠等待。

detatch()也不殺死線程。實際上它告訴std::thread即使std::thread對象被破壞,該線程仍應繼續運行。 C++在std :: thread析構函數中檢查線程是否加入或分離,並在檢查失敗時終止程序。

因此,如果您取消main函數中第一行的註釋,它將會崩潰。如果您取消註釋第二或第三行,它將正常工作。

#include <thread> 

void func() { 
} 

void fail1() { 
    std::thread t(func); 
    // will fail when we try to destroy t since it is not joined or detached 
} 

void works1() { 
    std::thread t(func); 
    t.join(); 
} 

void works2() { 
    std::thread t(func); 
    t.detach(); 
} 

int main() { 
    // fail1(); 
    // works1(); 
    // works2(); 
} 
相關問題