1. C++多线程编程基础解析
在现代计算机系统中,多核处理器已成为标配,而充分利用这些计算资源的关键就在于多线程编程。C++11标准引入的<thread>头文件彻底改变了C++处理并发编程的方式,让开发者能够以更直观的方式创建和管理线程。
1.1 std::thread基础用法
创建线程最直接的方式就是使用std::thread类。下面是一个最基本的线程创建示例:
cpp复制#include <iostream>
#include <thread>
void threadFunction() {
std::cout << "Hello from thread!\n";
}
int main() {
std::thread t(threadFunction);
t.join(); // 等待线程结束
return 0;
}
这里有几个关键点需要注意:
- 线程对象在构造时立即开始执行
- 必须明确决定是join()还是detach()线程
- 线程函数可以接受任意数量的参数
警告:如果在thread对象销毁前既没有调用join()也没有调用detach(),程序将调用std::terminate()终止!
1.2 线程传参的陷阱与技巧
向线程传递参数看似简单,实则暗藏玄机。考虑以下代码:
cpp复制void print(int i, const std::string& s) {
std::cout << i << ", " << s << "\n";
}
int main() {
std::thread t(print, 3, "hello");
t.join();
}
这里有一个潜在问题:字符串字面量"hello"会被转换为char*,然后在新线程中才构造std::string对象。如果主线程在这之前结束,可能会导致未定义行为。安全做法是显式构造string:
cpp复制std::thread t(print, 3, std::string("hello"));
1.3 线程同步与互斥锁
当多个线程访问共享资源时,必须使用同步机制。C++提供了std::mutex来实现基本的互斥:
cpp复制#include <mutex>
std::mutex mtx;
int shared_data = 0;
void increment() {
mtx.lock();
++shared_data;
mtx.unlock();
}
更安全的做法是使用RAII风格的std::lock_guard:
cpp复制void increment() {
std::lock_guard<std::mutex> lock(mtx);
++shared_data;
}
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程池的设计原理
2.1 为什么需要线程池
直接创建线程虽然简单,但在高并发场景下存在严重问题:
- 线程创建和销毁开销大
