C++ 创建简单线程 并join到主线程

发布时间:2025-05-13      访问量:56
在 C++ 中,可以使用标准库中的 `<thread>` 头文件来创建和管理线程。以下是一个简单的示例,展示如何创建线程并让主线程等待子线程完成:


**方法 1:使用函数指针创建线程**
cpp #include <iostream> #include <thread> // 线程函数 void threadFunction() { std::cout << "子线程开始执行" << std::endl; // 模拟耗时操作 for (int i = 0; i < 5; ++i) { std::cout << "子线程: " << i << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); } std::cout << "子线程执行完毕" << std::endl; } int main() { std::cout << "主线程开始" << std::endl; // 创建并启动线程 std::thread t(threadFunction); // 主线程等待子线程完成 t.join(); std::cout << "主线程结束" << std::endl; return 0; }

**输出结果:**
主线程开始 子线程开始执行 子线程: 0 子线程: 1 子线程: 2 子线程: 3 子线程: 4 子线程执行完毕 主线程结束


**方法 2:使用 Lambda 表达式创建线程**
cpp #include <iostream> #include <thread> int main() { std::cout << "主线程开始" << std::endl; // 使用 lambda 表达式创建线程 std::thread t([]() { std::cout << "子线程开始执行" << std::endl; std::this_thread::sleep_for(std::chrono::seconds(2)); std::cout << "子线程执行完毕" << std::endl; }); // 主线程等待子线程完成 t.join(); std::cout << "主线程结束" << std::endl; return 0; }


**方法 3:带参数的线程函数**
cpp #include <iostream> #include <thread> // 带参数的线程函数 void printNumbers(int start, int end) { for (int i = start; i <= end; ++i) { std::cout << "子线程: " << i << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(500)); } } int main() { // 创建带参数的线程 std::thread t(printNumbers, 1, 5); // 主线程继续执行其他任务 std::cout << "主线程继续执行..." << std::endl; // 等待子线程完成 t.join(); std::cout << "主线程结束" << std::endl; return 0; }


**关键说明:**
1. **`join()` 方法**:
- 主线程调用 `t.join()` 后会阻塞,直到子线程 `t` 执行完毕。
- 必须在 `std::thread` 对象销毁前调用 `join()` 或 `detach()`,否则会导致程序崩溃。

2. **`detach()` 方法**:
- 将线程与 `std::thread` 对象分离,使其在后台独立运行。
- 分离后的线程无法再被主线程等待或控制。
```cpp
t.detach(); // 分离线程
```

3. **异常安全**:
- 为避免线程资源泄漏,建议使用 RAII(资源获取即初始化)模式管理线程:
```cpp
class ThreadGuard {
public:
explicit ThreadGuard(std::thread& t) : thread(t) {}
~ThreadGuard() { if (thread.joinable()) thread.join(); }
ThreadGuard(const ThreadGuard&) = delete;
ThreadGuard& operator=(const ThreadGuard&) = delete;
private:
std::thread& thread;
};

// 使用示例
std::thread t(threadFunction);
ThreadGuard guard(t); // 自动管理 join
```


**编译和运行**
使用 g++ 编译时需要链接 `pthread` 库:
bash g++ -std=c++11 -pthread your_file.cpp -o thread_example ./thread_example


**总结**
- **创建线程**:通过 `std::thread` 构造函数传入可调用对象(函数、lambda 等)。
- **等待线程**:使用 `join()` 让主线程等待子线程完成。
- **分离线程**:使用 `detach()` 让线程在后台独立运行。
- **资源管理**:确保线程对象销毁前调用 `join()` 或 `detach()`,避免资源泄漏。
堆内存
多线程
strdup
初始化器
冒泡排序
增删改查
BufferedReader
输入输出
面向对象
生命周期
闭包的概念
原型链
Flask
mysql-connector-python
单例模式
浅拷贝
隔离级别
索引
InnoDB
左连接
聚合函数
PuTTY
TRUNCATE
str_starts_with_many
DateTime
array_combine
闭包的概念