std::thread的详细解析与使用示例
std::thread
是 C++11 引入的标准库类,用于创建和管理线程。线程是一种轻量级的进程,它允许程序并发执行不同部分的代码,提高运行性能和响应速度。
基本概念
- 线程:线程是操作系统能够调度的最小单元,它与其他线程共享进程的资源(如内存、文件句柄等),但拥有自己的堆栈和寄存器。
- 并发:多个线程可以独立执行代码,与其他线程同时运行。
使用 std::thread
的步骤
- 包含头文件:使用
#include <thread>
。 - 创建线程对象:可以通过传入一个可调用对象(函数指针、函数对象、Lambda 表达式)来构造
std::thread
。 - 启动线程:构造
std::thread
时,线程即开始执行。 - 主线程等待:使用
join
函数来等待线程完成。 - 资源分离:可以使用
detach
函数将线程独立出去。
基本使用示例
#include <iostream>
#include <thread>
// 一个简单的函数,用于在线程中运行
void printMessage(const std::string& message, int count) {
for (int i = 0; i < count; ++i) {
std::cout << message << " " << i << std::endl;
}
}
int main() {
// 创建一个线程,并传递函数和参数
std::thread t(printMessage, "Hello from thread", 5);
// 主线程继续执行其他工作
for (int i = 0; i < 5; ++i) {
std::cout << "Main thread " << i << std::endl;
}
// 等待新线程完成
t.join();
std::cout << "Thread has finished execution" << std::endl;
return 0;
}
关键函数
构造函数:创建并启动线程。
std::thread t(func, args...);
join():阻塞主线程,直到子线程完成。
t.join();
detach():将子线程分离,继续运行但不阻塞主线程。
t.detach();
joinable():检查线程是否可加入。
if (t.joinable()) {
t.join();
}
注意事项
- 结束前必须
join
或detach
:在线程对象销毁前,必须调用join
或detach
,否则程序会调用std::terminate
终止。 - 数据竞争:多个线程访问共享数据时要小心,可以使用互斥锁
std::mutex
来避免数据竞争。 - 线程安全:确保所有对共享资源的访问都是线程安全的。
通过使用 std::thread
,我们可以很容易地实现基本的并发编程,提升程序的执行效率和复杂度控制。在使用时需注意线程管理和资源分配,避免引发数据竞争等问题。