C++ 多執行緒的錯誤和如何避免(2) C++ 多執行緒的錯誤和如何避免(1)
阿新 • • 發佈:2022-05-13
試圖 join 一個已經 detach 的執行緒
如果你已經在某個地方分離了執行緒,那你不可以在主執行緒再次 join,這是一個明顯的錯誤
比如:
#include <iostream> #include <thread> using namespace std; void LaunchRocket() { cout << "Launching Rocket" << endl; } int main() { thread t1(LaunchRocket); t1.detach(); //..... 100 lines of code t1.join(); // CRASH !!! return 0; }
結果:(在 debug 模式下執行)
如何避免?
可以判斷 joinable 的狀態,比如
int main() { thread t1(LaunchRocket); t1.detach(); //..... 100 lines of code if (t1.joinable()) { t1.join(); } return 0; }
什麼是 joinable,可以參考:
小結:
在程式編譯時不會報錯,相反,在執行時會導致程式崩潰
不管是先 join 再 detach,還是重複 join 或者 detach,都會導致程式崩潰
參考: