1. 为什么需要C++多线程开发
现代计算机普遍采用多核CPU架构,单线程程序无法充分利用硬件资源。想象一下餐厅里只有一个服务员,即使有10张空闲餐桌也无法接待更多顾客。多线程就像雇佣多个服务员,让餐厅的接待能力成倍提升。
我在2015年第一次接触多线程开发时,曾用单线程处理图像数据,转换100张高清图片需要3分钟。改用4个线程后,时间缩短到45秒,这种性能提升是实实在在的。特别是在以下场景中,多线程优势尤为明显:
- 高并发网络服务(如Web服务器)
- 计算密集型任务(如视频编码)
- 异步IO操作(如数据库访问)
- 用户界面响应(防止主线程阻塞)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C++11线程基础实战
2.1 第一个多线程程序
先看一个最简单的例子,就像学编程必写的"Hello World":
cpp复制#include <iostream>
#include <thread>
void hello() {
std::cout << "Hello from thread!" << std::endl;
}
int main() {
std::thread t(hello); // 创建线程
t.join(); // 等待线程结束
return 0;
}
编译时需要加上C++11支持:
bash复制g++ -std=c++11 -pthread demo.cpp -o demo
这里有几个新手常踩的坑:
- 忘记
-pthread参数导致链接错误 - 没有调用join()或detach()导致程序终止
- 在Windows平台可能需要使用
-lpthread替代
2.2 三种线程创建方式
2.2.1 函数指针方式
cpp复制void task(int num) {
std::cout << "Processing task " << num << std::endl;
}
std::thread t1(task, 5); // 传递参数5
2.2.2 Lambda表达式方式
cpp复制std::thread t2([](){
std::cout << "Lambda thread running" << std::endl;
});
2.2.3 函数对象方式
cpp复制class Task {
public:
void operator()(int x) const {
std::cout << "Calculating " << x*x << std::endl;
}
};
std::thread t3(Task(), 10);
实际项目中,我推荐优先使用Lambda方式,因为:
- 代码更紧凑,逻辑更集中
- 可以方便捕获局部变量
- 避免了函数对象可能出现的"最令人烦恼的解析"问题
