1. 为什么我们需要并发编程
十年前我刚接触C++时,写个单线程程序就能解决大部分问题。但现在的程序要处理海量数据、高并发请求,单线程就像用一根吸管喝珍珠奶茶——不仅慢,还经常被"珍珠"卡住。C++11引入的并发库,就是给我们准备了一整套"多吸管"解决方案。
现代CPU都是多核的,你的笔记本可能就有4核8线程。如果程序只用单线程,就像买了辆跑车却只用1个气缸。我在处理图像分析项目时就深有体会:单线程处理100张图要3分钟,改成8线程后只要25秒。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程管理:从入门到翻车
2.1 创建线程的三种姿势
最基础的方式是用std::thread:
cpp复制void download(const string& url) {
cout << "Downloading: " << url << endl;
}
int main() {
thread t1(download, "https://example.com/1.zip");
thread t2(download, "https://example.com/2.zip");
t1.join();
t2.join();
}
这里有个新手必踩的坑:如果忘记join()或detach(),程序终止时会调用std::terminate。我就曾在调试时因为异常抛出导致线程未join,程序直接崩溃。
2.2 线程传参的暗礁
传递引用参数时要格外小心:
cpp复制void process(string& data); // 注意是引用
int main() {
string buffer = "hello";
thread t(process, buffer); // 编译错误!
thread t(process, std::ref(buffer)); // 正确
}
第一次写这段代码时,我花了2小时才搞明白为什么编译不过。编译器试图把buffer拷贝到线程内部,但函数参数要求引用,类型不匹配。
2.3 线程管理的经验法则
- RAII包装线程:
cpp复制class ThreadGuard {
thread& t;
public:
explic
