1. 程式人生 > 其它 >C++ 多執行緒的錯誤和如何避免(2) C++ 多執行緒的錯誤和如何避免(1)

C++ 多執行緒的錯誤和如何避免(2) C++ 多執行緒的錯誤和如何避免(1)

試圖 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,都會導致程式崩潰

參考: