====== C - C++ Threads - Transfer ownership of threads at runtime ======
**std::move** can be called to move the ownership of the underlying thread resource from one std::thread object to another.
----
===== Problem =====
#include
#include
#include
#include
void Func1()
{
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
std::cout << "Finished Func1"<< std::endl;
}
int main()
{
std::thread t1(Func1);
t1.join();
std::cout << "Continue Main" << std::endl;
return 0;
}
**NOTE:** The **Continue Main** message is only displayed once the function Func1 finishes.
This shows that the main() thread is blocked until the t1 thread completes.
A **join** blocks the thread that called it; in this example the thread that call the t1 thread is the main() thread.
This may result in the application freezing.
----
===== Solution =====
To not have to wait for a thread to finish, pass the thread to another function which will wait for the thread to finish and execute some action once the execution is done.
#include
#include
#include
#include
void Func1()
{
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
std::cout << "Finished Func1"<< std::endl;
}
void Func2(std::thread t1)
{
t1.join();
std::cout << "Finished Func2" << std::endl;
}
int main()
{
std::thread t1(Func1);
// Pass the responsibility of monitoring the t1 thread to t2.
std::thread t2(Func2, std::move(t1));
// Do a bunch of other processing without waiting for t1 to finish.
std::cout << "Continue Main" << std::endl;
// Finally wait for t2 to finish.
t2.join();
return 0;
}
**NOTE:** Notice that now the **Continue Main** message is displayed even before the thread function finishes.
Ownership of the t1 thread is passed to a different thread, in this example, t2, allowing the main() thread to not be blocked.