std::thread方法join与detach

发布时间 2023-11-24 15:14:54作者: 左边的翼

1、std::join

  std::joinstd::thread类的成员函数之一,用于等待线程的执行完成。

 

#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <atomic>
void process(std::string str_info)
{
    for (int i = 0; i < 500; ++i) {
        std::cout << "sub thread " << str_info.c_str() << " executing\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

int main()
{
    std::thread tr(process, "子线程");
    tr.join();
    system("pause");
}

 

  代码中tr.join()调用后,主线程将在执行完子线程任务后继续执行主线程任务,tr.join()将会阻塞主线程。

2、std::detach

  std::detachstd::thread类的成员函数之一,用于将线程分离,使得线程的执行与创建线程的对象无关。

 

#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <atomic>
void process(std::string str_info)
{
    for (int i = 0; i < 500; ++i) {
        std::cout << "sub thread " << str_info.c_str() << " executing\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

int main()
{
    std::thread tr(process, "子线程");
    tr.detach();
    system("pause");
}

 

  代码中tr.detach()调用后,子线程与主线程进行分离,主线程继续执行,不会等待子线程执行,子线程在后台并行执行。此处需要注意的是在子线程分离后将无法使用std::thread::join函数等待线程执行完成。

3、不调用std::detach与std::join的情况

  两者都不调用的情况下,子线程默认在后台同步执行。