【C++】std::thread 标准库线程的基本使用
在C++中,std::thread 类是C++11引入的标准库组件,用于创建和管理线程。
1. 头文件
首先,需要包含 #<thread>
头文件来使用 std::thread。
#include <iostream>
#include <thread>
2. 定义函数
定义线程执行的函数或可调用对象,可以定义一个普通函数、lambda表达式、函数对象或成员函数作为线程执行的任务
void threadFunction(int id) {
std::cout << "Thread " << id << " is running." << std::endl;
}
3. 创建线程
使用 std::thread 构造函数创建线程实例,传入要执行的函数和相应的参数。
std::thread myThread(threadFunction, 1);
4. 启动线程
- Join: 使用 join() 方法等待线程结束。调用 join() 后,主线程会阻塞,直到该子线程完成。
- Detach: 使用 detach() 方法使线程独立运行,不再与创建它的线程关联。一旦线程被分离,就不能再 join() 它,它会在后台独立运行直到完成。
线程状态
- joinable() 方法用来检查线程是否可以被 join()。如果线程已经被 join() 过或者被 detach() 过,那么它就不是 joinable 的。
// join
if (myThread.joinable()) {
myThread.join();
}
// detach
if (myThread.joinable()) {
myThread.detach();
}
5. 示例
std::thread 的例子
#include <iostream>
#include <thread>
void printHello(int times) {
for (int i = 0; i < times; ++i) {
std::cout << "Hello from thread! " << i << std::endl;
}
}
int main() {
std::thread myThread(printHello, 5);
std::cout << "Main thread doing something else..." << std::endl;
// 等待线程结束
if (myThread.joinable()) {
myThread.join();
}
std::cout << "All threads done." << std::endl;
return 0;
}
6. 注意事项
- 确保在销毁 std::thread 对象之前,要么调用了 join(),要么调用了 detach(),否则会引发未定义行为。
- 在多线程编程中,还需要考虑线程同步问题,比如使用互斥锁 (std::mutex)、条件变量 (std::condition_variable) 等来避免数据竞争和不一致问题。