2017-08-16 67 views
-3

爲什麼要使用std::thread::join然後等到該線程結束?我認爲多線程的目的是,我開始更多的線程平行。 而不是join(),我也可以調用函數「正常」,如foo()。 那麼爲什麼他們的join()?是不是我需要的唯一東西detach()主題::加入和取消

+1

您可以在線程的開始和「join」調用之間執行任務,然後將同時執行。 'thread :: join'確保線程在調用返回時完成,所以你可以安全地使用結果。 –

+1

'join'和'detach'是互斥的。 –

+0

@BaummitAugen你是什麼意思與線程的開始?初始化? – RoQuOTriX

回答

3

考慮在這裏會發生什麼:

int value = 0; 
void myWorkerFunction(){value = 1;} 

int main() 
{ 
    std::thread t(myWorkerFunction); 
    t.detach(); 
    std::cout << value << std::endl; 
} 

您現在有一個競爭條件。 value需要打印之前,您的線程可能會或可能不會完成所需的所有工作。 *

考慮join是一種同步形式,如mutex;您必須等待正在執行的線程釋放互斥鎖(完成),然後才能繼續。

有時候脫離一個線程是有道理的,如果說,它可以在後臺工作,執行可能不是關鍵任務的任務。

我thougt多線程的目的是,我開始更多的線程paralelly [原文]

你不會被迫join一個線程被創建之後。您可以創建N個線程,然後關閉並執行其他一些工作。只有當你想保證線程完成時,你需要join


*這個例子是過於簡單化的方式進行解釋的目的。線程創建常常在main以外的其他對象或函數中發生。從設計上來看,通常是非常明顯的。 (但是我們必須始終在detachjoin或之前超出範圍)