-3
爲什麼要使用std::thread::join
然後等到該線程結束?我認爲多線程的目的是,我開始更多的線程平行。 而不是join()
,我也可以調用函數「正常」,如foo()
。 那麼爲什麼他們的join()
?是不是我需要的唯一東西detach()
?主題::加入和取消
爲什麼要使用std::thread::join
然後等到該線程結束?我認爲多線程的目的是,我開始更多的線程平行。 而不是join()
,我也可以調用函數「正常」,如foo()
。 那麼爲什麼他們的join()
?是不是我需要的唯一東西detach()
?主題::加入和取消
考慮在這裏會發生什麼:
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
以外的其他對象或函數中發生。從設計上來看,通常是非常明顯的。 (但是我們必須始終在detach
或join
或之前超出範圍)
您可以在線程的開始和「join」調用之間執行任務,然後將同時執行。 'thread :: join'確保線程在調用返回時完成,所以你可以安全地使用結果。 –
'join'和'detach'是互斥的。 –
@BaummitAugen你是什麼意思與線程的開始?初始化? – RoQuOTriX