厨房里几个厨师同时备菜的场景,恰好多线程工作的写照。C++11开始,这门语言终于有了原生的多线程支持,就像给程序员配了套趁手的厨具。
基础概念认知
先理清三个关键概念:
- 线程:执行流的最小单元,类似独立工作的厨师
- 进程:资源分配的基本单位,好比整个后厨空间
- 并发:多个任务在重叠时间段执行,像同时煮汤和切菜
特性 | 线程 | 进程 |
内存占用 | 共享 | 独立 |
创建开销 | 1MB左右 | 10MB起 |
通信成本 | 低 | 高 |
创建线程的三种方式
std::thread基础用法
就像雇佣新员工,需要明确工作内容:
includeincludevoid burger_task {std::cout<< "开始煎肉饼..."<< std::endl;int main {std::thread cook(burger_task); // 创建线程cook.join; // 等待完成return 0;
Lambda表达式创建
临时任务用lambda更便捷:
std::thread pizza_chef([]{std::cout<< "披萨面团准备中..."<< std::endl;});
带参数的任务
给厨师传菜单参数:
void prepare_ingredient(int amount, std::string name) {// 处理食材逻辑std::thread chef(prepare_ingredient, 5, "西红柿");
线程管理技巧
- detach:让线程独立运行,像自助餐台的保温设备
- 硬件并发数获取:std::thread::hardware_concurrency
- 线程转移所有权:std::move实现
方法 | 适用场景 | 风险点 |
join | 顺序依赖任务 | 死锁风险 |
detach | 后台任务 | 资源释放问题 |
数据安全防护
多个厨师共用冰箱时需要规则:
互斥锁实战
std::mutex fridge_mtx; // 冰箱锁void use_fridge {fridge_mtx.lock;// 操作共享资源fridge_mtx.unlock;
智能锁应用
自动管理上锁解锁:
std::mutex oven_mtx;void use_oven {std::lock_guard lg(oven_mtx);// 自动释放锁
通信与协调
后厨各岗位需要配合:
- 条件变量:std::condition_variable
- 原子操作:std::atomic
- 信号量:C++20引入
工具 | 等待方式 | 唤醒机制 |
条件变量 | 主动等待 | notify_one/all |
future/promise | 被动等待 | 自动通知 |
性能优化方向
避免成为厨房瓶颈:
- 减少锁竞争:细粒度锁、读写锁
- 任务窃取:std::async自动调度
- 内存对齐:alignas关键字
窗外的阳光斜照在键盘上,调试完最后一个竞态条件的程序员端起凉掉的咖啡。屏幕上的线程监控图平稳跳动着,像极了后厨里默契配合的厨师团队。