1. C++多线程编程概述
现代计算机硬件已经全面进入多核时代,即使是普通的消费级CPU也普遍拥有4-8个核心。作为一名C++开发者,掌握多线程编程技术不再是加分项,而是必备技能。我在实际项目中发现,合理使用多线程可以将程序性能提升数倍甚至数十倍,特别是在数据处理、游戏开发、服务器编程等领域。
C++11标准之前,多线程编程需要依赖平台特定的API,比如Linux下的pthreads或Windows的线程API。这不仅增加了开发难度,还严重影响了代码的可移植性。C++11引入的<thread>头文件彻底改变了这一局面,为开发者提供了一套标准化的多线程工具集。
重要提示:虽然C++多线程API设计得相对易用,但并发编程本身就是一个复杂领域。我在团队代码审查中最常看到的问题就是线程安全相关的bug,这些bug往往难以复现却可能造成严重后果。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程基础操作
2.1 创建与管理线程
让我们从一个最简单的例子开始,了解如何创建和运行线程:
cpp复制#include <iostream>
#include <thread>
#include <chrono>
void worker(int id) {
std::cout << "Worker " << id << " started\n";
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Worker " << id << " finished\n";
}
int main() {
std::thread t1(worker, 1);
std::thread t2(worker, 2);
t1.join();
t2.join();
std::cout << "All threads completed\n";
return 0;
}
这段代码展示了线程编程的几个关键点:
- 使用
std::thread类创建线程,构造函数接受一个可调用对象(这里是worker函数)和它的参数 join()方法会阻塞当前线程,直到目标线程执行完毕- 如果不调用join或detach,线程析构时会调用std::terminate终止程序
2.2 线程生命周期管理
在实际项目中,我发现很多开发者对线程的生命周期管理不够重视,导致资源泄漏或程序崩溃。以下是几个关键注意事项:
-
join与detach的选择:
join():等待线程完成,确保线程资源被正确回收detach():分离线程,使其在后台运行,主线程不必等待- 经验法则:除非有特殊需求,否则优先使用join()
-
异常安全:
如果线程启动后但在join调用前抛出异常,程序可能会终止。解决方案是使用RAII技术:
cpp复制class ThreadGuard {
std::thread& t;
public:
explicit ThreadGuard(std::thread& t_) : t(t_) {}
~ThreadGuard() {
if(t.joinable()) {
t.join();
}
}
