我讀了一些關於manuals線程和我來一想,他們表現出的代碼是不是安全:螺紋連接問題
std::cout << "starting first helper...\n";
std::thread helper1(foo);
std::cout << "starting second helper...\n";
std::thread helper2(bar);
std::cout << "waiting for helpers to finish..." << std::endl;
helper1.join(); // #1 NOT SAFE
helper2.join(); // #2 NOT SAFE
我相信這個代碼是不是絕對安全的。如果我沒有弄錯沒有保證helper1
和helper2
已經處於可連接狀態時,控制到達線路標記爲#1
和#2
。線程仍然可以不啓動,並且此時沒有標識符。這將導致未捕獲的異常從std::thread::join()
我認爲下面的代碼解決了這個問題被拋出。我對嗎?
std::cout << "starting first helper...\n";
std::thread helper1(foo);
std::cout << "starting second helper...\n";
std::thread helper2(bar);
std::cout << "waiting for helpers to finish..." << std::endl;
while (helper1.joinable() == false) { }
helper1.join(); // #1 SAFE
while (helper2.joinable() == false) { }
helper2.join(); // #2 SAFE
不能線程是可連接,即使它沒有啓動? HTTP://計算器。com/questions/15994650/c11-safely-join-a-thread-without-using-a-try-catch-block – doctorlove
@doctorlove'std :: thread :: joinable如果線程對象標識一個活動的執行線程,則返回true ,否則爲假。我認爲它不能。 – Kolyunya
你在引用什麼? – doctorlove