Table of Contents

C - C++ Threads - Troubleshooting - Program Crashes - Forgetting to join a thread

Forgetting to join a thread or detach it (make it unjoinable) before the main program terminates, will cause in a program crash.

For example, the t1 thread is not joined to the main thread.

#include <iostream>
#include <thread>
using namespace std;
 
 
void HelloWorld()
{
  cout << "Hello World" << endl;
}
 
 
int main()
{
  thread t1(HelloWorld);
  //t1.join();  // If the thread is not joined to the main thread it will cause a crash.
  return 0;
}

NOTE: Why does it crash ???

  • This is because, at the end of the main function, thread t1 goes out of scope and the thread destructor is called.
  • Inside the destructor, a check is performed to see if thread t1 is joinable.
  • A joinable thread is a thread that has not been detached.
  • If the thread is joinable, std::terminate is called.

Resolution

There are two ways to fix this depending on your needs.

1. Join the thread t1 to the main thread

int main()
{
  thread t1(HelloWorld);
  t1.join();  // Join t1 to the main thread.
  return 0;
}

2. Detach the thread t1 from the main thread and let it continue as a daemon thread

int main()
{
  thread t1(HelloWorld);
  t1.detach();  // Detach t1 from main thread.
  return 0;
}