User Tools

Site Tools


c:c_threads:troubleshooting:program_crashes:forgetting_to_join_a_thread

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;
}

c/c_threads/troubleshooting/program_crashes/forgetting_to_join_a_thread.txt · Last modified: 2021/06/07 08:58 by peter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki