1. 为什么需要学习C++多线程开发?
在当今计算环境中,单核处理器的性能提升已经遇到物理瓶颈。现代计算机普遍采用多核架构,我的开发机就是一台6核12线程的处理器。但如果你只写单线程程序,就相当于花高价买了6个炉灶却只用其中一个炒菜。
去年我参与优化一个图像处理项目时,最初版本的单线程处理耗时47秒。通过多线程改造后,性能提升到8秒,效果立竿见影。这种性能飞跃在以下场景尤为明显:
- 游戏开发中的物理模拟和AI计算
- 金融分析中的大规模数据处理
- 科学计算中的矩阵运算
- 服务器程序的高并发处理
注意:多线程不是银弹。线程间的同步开销、数据竞争等问题如果处理不当,反而会降低性能。我在初期就犯过开100个线程导致性能反而不如单线程的错误。
2. 现代C++多线程基础
2.1 线程创建与管理
C++11引入了<thread>头文件,让线程创建变得简单。下面是我常用的三种线程创建方式:
cpp复制// 方式1:函数指针
void task1(int param) {
cout << "线程执行,参数:" << param << endl;
}
// 方式2:Lambda表达式
auto task2 = [](){
cout << "Lambda线程执行" << endl;
};
// 方式3:函数对象
class Task {
public:
void operator()() {
cout << "函数对象线程执行" << endl;
}
};
int main() {
thread t1(task1, 42); // 方式1
thread t2(task2); // 方式2
thread t3(Task()); // 方式3
t1.join();
t2.join();
t3.join();
}
实际项目中我更推荐使用Lambda方式,因为它可以方便地捕获局部变量。但要注意生命周期问题——我曾遇到线程还在运行而捕获的局部变量已经销毁的bug。
2.2 线程同步原语
互斥量(mutex)
这是最基本的同步工具,但使用时有几个坑:
cpp复制mutex mtx
