**方法 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()`,避免资源泄漏。