C++11-thread(join detach joinable)

本文展示了如何使用C++11标准库中的线程功能来创建并运行一个简单的线程。通过main函数和testThread函数的实例,介绍了线程的创建、执行和join方法的使用。

#include <iostream>
#include <thread> //c++11中 thread的头文件 C++11中的很多函数都放到了std库里面

void testThread()
{
   std::cout << "this is funciton: " << __func__ << std::endl;
}
int main()
{
    std::cout << "first function: "<<__func__ << std::endl;
    std::thread th1(testThread);
    th1.join();
    std::cout << __func__ << " end" << std::endl;
}

C++ 中,`std::thread` 的 `join()` 和 `detach()` 是用于管理线程生命周期的两个关键方法,它们决定了主线程(或创建线程)如何与子线程交互。 --- ### 1. `join()` - **作用**:调用 `join()` 会阻塞当前线程(通常是主线程),直到被调用的子线程执行完毕。 - **使用场景**:当你希望主线程等待子线程完成后再继续执行时使用。 - **特点**: - 线程是**可连接的(joinable)** 才能调用 `join()`。 - 调用一次后,线程对象就不再是 joinable- **示例代码**: ```cpp #include <iostream> #include <thread> void threadFunc() { std::cout << "子线程正在运行..." << std::endl; } int main() { std::thread t(threadFunc); if (t.joinable()) { t.join(); // 主线程等待子线程结束 } std::cout << "子线程已结束,主线程继续执行。" << std::endl; return 0; } ``` --- ### 2. `detach()` - **作用**:将子线程与主线程分离,使其独立运行,不再受主线程控制。 - **使用场景**:当你不关心子线程何时结束,或者希望它在后台异步执行。 - **特点**: - 子线程将在后台运行,资源由系统自动回收。 - 一旦调用 `detach()`,就不能再调用 `join()`。 - **示例代码**: ```cpp #include <iostream> #include <thread> #include <chrono> void threadFunc() { std::this_thread::sleep_for(std::chrono::seconds(2)); std::cout << "后台线程执行完毕。" << std::endl; } int main() { std::thread t(threadFunc); t.detach(); // 分离线程 std::cout << "主线程继续执行,不等待子线程。" << std::endl; // 避免主线程退出太快导致子线程还没执行完程序就结束了 std::this_thread::sleep_for(std::chrono::seconds(3)); return 0; } ``` --- ### 总结对比: | 特性 | `join()` | `detach()` | |-------------------|-------------------------------------|--------------------------------------| | 是否阻塞主线程 | 是 | 否 | | 是否需要等待线程结束 | 是 | 否 | | 线程是否独立运行 | 否,需等待 | 是,后台运行 | | 是否可以再次调用 | 不可以(调用后变为不可 joinable) | 不可以(只能调用一次) | | 安全性 | 更安全(确保线程已完成) | 需要特别注意资源管理和生命周期问题 | --- ### 注意事项: - 如果一个线程对象在未调用 `join()` 或 `detach()` 的情况下被销毁,程序会抛出异常(调用 `std::terminate()`)。 - 使用 `detach()` 时必须小心避免访问局部变量或已经销毁的对象,否则会导致未定义行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值