C++ 中 thread 的 join 和 detach 的区别?

在 C++ 中,std::thread 是用来表示线程的标准库类。每个 std::thread 对象都与一个线程相关联。当线程结束时,有两种处理方式:joindetach。这两种方法处理线程生命周期的不同方式:

join

  1. 等待线程结束:调用 join() 方法会等待线程自然结束。直到线程执行完毕,调用 join() 的线程才会继续执行。
  2. 资源清理join() 会确保线程的资源被适当地清理。一旦线程结束,std::thread 对象将不再与任何线程关联。
  3. 用途:当需要确保线程执行完毕后再继续执行其他任务时,使用 join() 是合适的。

detach

  1. 分离线程:调用 detach() 方法会将线程与 std::thread 对象分离。std::thread 对象将不再控制线程,线程将继续执行直到完成。
  2. 资源管理:一旦线程被分离,线程的资源(如堆栈)将由操作系统在线程结束时自动清理。但是,如果线程尝试访问其所属程序的全局或静态变量,这些变量可能已经被销毁,因为 std::thread 对象可能已经销毁了。
  3. 用途:当不需要等待线程结束,或者线程执行的是长时间运行的任务,而主线程需要继续执行其他任务时,使用 detach() 是合适的。

示例

#include <iostream>
#include <thread>

void threadFunction() {
    std::cout << "Thread function is running\n";
}

int main() {
    std::thread t(threadFunction);

    // 使用 join 等待线程结束
    t.join();
    std::cout << "Thread has finished execution (join)\n";

    // 创建另一个线程并使用 detach 来分离
    std::thread t2(threadFunction);
    t2.detach();
    std::cout << "Thread has been detached (detach)\n";

    return 0;
}

注意事项

  • 如果线程被分离 (detach()) 后,std::thread 对象被销毁,而线程还在运行,那么线程将继续执行,但是它的状态将无法被查询或管理。
  • 如果线程结束前没有调用 join()detach()std::thread 对象的析构函数将抛出一个 std::thread::join_errc::nostate 异常。
  • 通常,如果线程执行的任务是短暂的,并且我们希望在主线程中等待线程结束,使用 join() 更为合适。如果线程执行的是长时间运行的任务,并且我们希望主线程继续执行其他任务,使用 detach() 更为合适。

正确地管理线程的生命周期对于避免资源泄漏和程序崩溃是非常重要的。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值