news 2026/6/15 19:40:57

C++多线程编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++多线程编程

我们可以把“多线程编程 (Multi-threaded Programming)”理解为“并发管理”

1. 核心比喻:厨房与厨师

  • 进程 (Process)=一家餐厅(厨房)

    • 它有独立的冰箱(内存)、独立的煤气管道(资源)。

    • 餐厅倒闭了(进程崩溃),里面的东西都没了。

  • 线程 (Thread)=厨房里的厨师

    • 单线程:厨房里只有一个厨师。他必须先切菜,切完再炒菜,炒完再装盘。客人等得花儿都谢了。

    • 多线程:厨房里有三个厨师

      • 厨师 A 负责切菜。

      • 厨师 B 负责炒菜。

      • 厨师 C 负责装盘。

    • 优势:大家同时干活,效率极高(利用多核 CPU)。

    • 风险:他们共享同一个冰箱(内存/PlanContext)。如果厨师 A 正在拿肉,厨师 B 突然把冰箱门关了夹住 A 的手,或者两人同时抢一把刀,就会出事。


2. 为什么要搞多线程?(自动驾驶场景)

在你的PlanningNode里,如果只有单线程,代码是这样跑的:

  1. 等激光雷达数据进来(耗时 10ms)...

  2. 等定位数据进来(耗时 5ms)...

  3. 开始规划路径(耗时 50ms)...

  4. 发送控制指令。

后果:车子在等数据的时候是“发呆”的,规划频率极其低下,车子开起来一顿一顿的,甚至会因为反应慢撞墙。

引入多线程后:

  • 线程 1(收发员):专门负责收 ROS 消息(Callback)。有数据来就塞进PlanContext,不用等规划算完。

  • 线程 2(计算员):专门负责算 OSQP(Timer Loop)。不管有没有新数据,我每 100ms 必须算一次,保证车子一直有指令。

这就是“异步高效”的本质。


3. 多线程编程的三个核心要素

在 C++ 代码中,你主要会遇到这三个东西:

A. 创建线程 (Create)
#include <thread> void task() { // 具体的干活逻辑 } int main() { std::thread t1(task); // 创建并启动线程 t1 t1.detach(); // 让它自己去跑,不管它了 // 或者 t1.join(); // 主线程在这里等,直到 t1 干完活才继续 }
B. 资源共享 (Sharing)

就像大家共用一个冰箱。

在你的项目中,PlanContext就是那个最大的共享资源。

  • ROS 回调线程往里面写。

  • 规划主线程从里面读。

C. 同步与互斥 (Synchronization & Mutex)

这是最难的地方。因为大家共用资源,所以必须立规矩。

  • 竞态条件 (Race Condition):两个线程同时改一个变量,导致结果错误。(就是刚才说的“抢刀”)。

  • 互斥锁 (Mutex):解决竞态条件的工具。(刚才讲的“试衣间锁”)。

  • 死锁 (Deadlock)

    • 厨师 A 拿着刀,等锅。

    • 厨师 B 拿着锅,等刀。

    • 两人僵持不下,厨房彻底停摆。


4. 你的代码架构中的体现

回头看你的架构图,多线程是这样运作的:

  1. ROS 2 的底层:ROS 2 默认就是一个多线程的中间件。当你定义了多个Subscription(订阅)时,ROS 内部会有线程池(Executor)帮你去“监听”数据。

  2. 回调并发:当LocalizationPose(定位)和ObstacleArray(感知)同时到达时,可能会有两个不同的线程同时试图调用PlanContext::updateData

  3. 保护机制:所以PlanContext里必须有std::mutex。谁先抢到锁,谁先写,另一个排队。

5.提醒:

  1. 敬畏全局变量:只要你定义了一个全局变量或者静态变量(单例),就要立刻想到:“这会被多个线程同时访问吗?”

  2. 加锁要用 RAII:永远使用std::lock_guardstd::unique_lock,不要手动lock()unlock(),防止死锁。

  3. 多看 Log:多线程的 Bug 很难复现(因为是概率性的)。如果程序偶尔崩溃,大概率是哪里没加锁。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 13:20:17

Singulus 获得 microLED 沉积系统新订单

美国客户因扩产而追加订单&#xff0c;Singulus Technologies 已收到一笔后续订单&#xff0c;将为某一客户提供用于 microLED 生产的 TIMARIS 沉积系统。此前&#xff0c;该客户已完成首台同类型系统的安装与调试&#xff0c;此次追加订单旨在扩大其在美国现有的生产能力。 T…

作者头像 李华
网站建设 2026/6/15 13:19:18

资源等级:楼宇企业网络资源分级与负载管理的标准化交付方案

明确资源等级标准、规范资源分配机制、实施流量负载管理 摘要 面向设备集成商、IT外包公司、宽带组网运营商及楼宇企服资源方等技术服务伙伴&#xff0c;依托可视化运行监控系统&#xff0c;提供系统规划、标准化交付与平台化运维支撑能力。通过资源等级划分、动态分配与负载…

作者头像 李华
网站建设 2026/6/15 13:19:33

系统评估:助力集成商为客户交付端到端网络连通评估方案

验证接入系统连通性、测试路由系统连通性、评估广域网连通质量 摘要 面向设备集成商、IT外包公司、宽带组网运营商及楼宇企服资源方等技术服务伙伴&#xff0c;依托可视化运行监控系统&#xff0c;提供系统规划、标准化交付与平台化运维支撑&#xff0c;赋能其为客户构建端到…

作者头像 李华
网站建设 2026/6/15 14:42:02

冗余标准:支撑运维商为客户交付全链路交换冗余保障方案

制定接入系统冗余标准、设计汇聚层冗余架构、统一交换系统冗余标准 摘要 本文为设备集成商、IT外包公司、宽带组网运营商及楼宇企服资源方等技术服务伙伴赋能&#xff0c;结合可视化运行监控系统&#xff0c;提供系统规划、标准化交付与平台化运维支撑&#xff0c;助力其为客…

作者头像 李华
网站建设 2026/6/15 13:10:08

2026毕设ssm+vue旅店管理系统论文+程序

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景随着我国旅游业的蓬勃发展和商务出行需求的持续增长&#xff0c;酒店行业迎来了前所未有的发展机遇。根据中国饭店协会数据显示…

作者头像 李华
网站建设 2026/6/15 18:59:56

激光切割雕刻机设计

2激光切割机所能实现的两种功能及特点 2.1激光切割 采用激光切割技术切割金属板材时&#xff0c;由于对板材无作用力&#xff0c;且热形变很小&#xff0c;所以适合切割精度要求较高的零件。激光切割术的加工原理是用凸透镜将激光器发出的激光束聚焦在工件表面上产生的高温使工…

作者头像 李华