User Tools

Site Tools


c:c_threads:troubleshooting:program_crashes:forgetting_to_join_a_thread

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

c:c_threads:troubleshooting:program_crashes:forgetting_to_join_a_thread [2021/06/07 08:58] – created peterc:c_threads:troubleshooting:program_crashes:forgetting_to_join_a_thread [2021/06/07 08:58] (current) peter
Line 1: Line 1:
 ====== 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.
 +
 +<code cpp>
 +#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;
 +}
 +</code>
 +
 +<WRAP info>
 +**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.
 +</WRAP>
 +
 +
 +----
 +
 +===== Resolution =====
 +
 +There are two ways to fix this depending on your needs.
 +
 +==== 1.  Join the thread t1 to the main thread ====
 +
 +<code cpp>
 +int main()
 +{
 +  thread t1(HelloWorld);
 +  t1.join();  // Join t1 to the main thread.
 +  return 0;
 +}
 +</code>
 +
 +----
 +
 +==== 2. Detach the thread t1 from the main thread and let it continue as a daemon thread ====
 +
 +<code cpp>
 +int main()
 +{
 +  thread t1(HelloWorld);
 +  t1.detach();  // Detach t1 from main thread.
 +  return 0;
 +}
 +</code>
 +
 +----
  
c/c_threads/troubleshooting/program_crashes/forgetting_to_join_a_thread.1623056296.txt.gz · Last modified: 2021/06/07 08:58 by peter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki