C++多线程编程 📅 发布时间:2026/7/14 5:55:07 👁️ 浏览次数: 我们可以把“多线程编程 (Multi-threaded Programming)”理解为“并发管理”。1. 核心比喻厨房与厨师进程 (Process)一家餐厅厨房。它有独立的冰箱内存、独立的煤气管道资源。餐厅倒闭了进程崩溃里面的东西都没了。线程 (Thread)厨房里的厨师。单线程厨房里只有一个厨师。他必须先切菜切完再炒菜炒完再装盘。客人等得花儿都谢了。多线程厨房里有三个厨师。厨师 A 负责切菜。厨师 B 负责炒菜。厨师 C 负责装盘。优势大家同时干活效率极高利用多核 CPU。风险他们共享同一个冰箱内存/PlanContext。如果厨师 A 正在拿肉厨师 B 突然把冰箱门关了夹住 A 的手或者两人同时抢一把刀就会出事。2. 为什么要搞多线程自动驾驶场景在你的PlanningNode里如果只有单线程代码是这样跑的等激光雷达数据进来耗时 10ms...等定位数据进来耗时 5ms...开始规划路径耗时 50ms...发送控制指令。后果车子在等数据的时候是“发呆”的规划频率极其低下车子开起来一顿一顿的甚至会因为反应慢撞墙。引入多线程后线程 1收发员专门负责收 ROS 消息Callback。有数据来就塞进PlanContext不用等规划算完。线程 2计算员专门负责算 OSQPTimer 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. 你的代码架构中的体现回头看你的架构图多线程是这样运作的ROS 2 的底层ROS 2 默认就是一个多线程的中间件。当你定义了多个Subscription订阅时ROS 内部会有线程池Executor帮你去“监听”数据。回调并发当LocalizationPose定位和ObstacleArray感知同时到达时可能会有两个不同的线程同时试图调用PlanContext::updateData。保护机制所以PlanContext里必须有std::mutex。谁先抢到锁谁先写另一个排队。5.提醒敬畏全局变量只要你定义了一个全局变量或者静态变量单例就要立刻想到“这会被多个线程同时访问吗”加锁要用 RAII永远使用std::lock_guard或std::unique_lock不要手动lock()和unlock()防止死锁。多看 Log多线程的 Bug 很难复现因为是概率性的。如果程序偶尔崩溃大概率是哪里没加锁。
路由策略:支撑IT外包公司为客户交付重点业务保障的路由策略方案 管理传输资源本地化、部署重点需求策略路由、实施传输需求等级管理 摘要 针对设备集成商、IT外包公司、宽带组网运营商及楼宇企服资源方等技术服务伙伴,结合可视化运行监控系统,提供系统规划、标准化交付与平台化运维支撑,助力其为客户实现… 2026/7/14 5:45:00
UE5 C++(55-2)读写文件用结构体 FFileHelper 的成员函数 LoadFileToString(..)和 SaveStringArrayToFile(..) (271) 补充代码 : (272)蓝图调用与运行结果 : (273) 谢谢 2026/7/14 5:43:07
d3dx10d_43.dll文件丢失找不到情况 免费下载方法分享 在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装… 2026/5/17 0:37:11
大模型提示词注入攻击原理与四层防御实战指南 1. 项目概述:当大模型“听错话”时,你的系统就已失守你肯定知道SQL注入——那个让数据库在毫无防备中交出全部家底的经典漏洞。用户在登录框里输入一句 OR 11,后端没做任何过滤,直接拼进SQL语句,结果整张用户表被拖走。… 2026/7/14 5:53:11
Claude平台Skills开发指南:从原理到实践 1. Skills开发概述Skills是Claude平台上的功能扩展模块,类似于智能手机上的应用程序。通过开发Skills,开发者可以为Claude添加特定领域的能力,使其能够完成更专业的任务。这就像给一个多面手配备各种专业工具,让它在不同场景下都能… 2026/7/14 5:49:09
弱磁控制(十四) 第 14 篇:弱磁控制——让电机跑得更快 FOC 控制下,电机速度受到一个硬性限制——反电动势达到直流母线电压。此时即使电流环输出再大的 Vq,逆变器也输不出足够的电压。弱磁控制就是突破这个限制的方法。1. 为什么要弱磁 电机电压方程… 2026/7/14 5:45:07
现代C++并发编程实战指南:从线程池到原子操作避坑 1. 项目概述:一份值得收藏的并发编程实战指南最近在整理硬盘,翻出来一堆以前学习C并发编程时搜集的资料和笔记。说实话,C的多线程和并发,绝对是让很多从C98/03时代过来的老程序员又爱又恨的一块内容。爱的是,它能让你的… 2026/7/14 5:45:07
LED驱动电源性价比厂家筛选关键要素梳理 在光伏照明系统与智能控制应用中,LED驱动电源作为能量转换与控制的核心组件,其性能与可靠性直接影响系统整体效率与使用寿命。面对市场上众多供应商,如何客观筛选具备性价比优势的厂家,需从技术能力、生产体系与质量控制三个维度进… 2026/7/14 5:45:07
临沂太阳能控制器选型工艺与工程落地标准解析 一、太阳能控制器在临沂市场的工程应用背景临沂作为北方物流枢纽城市,其太阳能光伏产业近年来发展迅速。本地太阳能控制器应用主要集中在农村分布式光伏、农业灌溉系统、交通信号灯、市政照明等场景。由于该地区四季分明、光照资源充足且昼夜温差较大,对… 2026/7/14 5:45:07
XUnity.AutoTranslator 游戏实时翻译插件:从原理到实战的完整指南 1. 项目概述:当游戏语言成为一堵墙作为一名玩了十几年日系、欧美独立游戏的“老油条”,我太懂那种面对一款心仪已久、画风玩法都戳中G点的游戏,却因为语言不通而望而却步的痛了。尤其是那些基于Unity引擎开发的、体量不大但内容精良的作品&am… 2026/7/14 0:05:14
2026普通文员学数据分析的价值 一、2026年普通文员学习数据分析的必要性随着数字化转型加速,数据分析技能正逐渐成为职场基础能力。普通文员学习数据分析可以提升工作效率、增强竞争力,并为职业转型提供更多可能性。二、数据分析对文员的价值自动化办公:通过数据分析工具&a… 2026/7/14 0:05:14
2026从计划员到主管,生产管理者学数据分析有用吗? 一、生产管理领域的职业发展路径 从计划员到主管的角色转变,是生产管理者职业发展的典型路径。计划员主要负责生产排程、库存管理和资源协调等基础工作,而主管则需要承担团队管理、决策支持和效率优化等更高级别的职责。这种转变不仅仅是职位的提升&… 2026/7/14 0:05:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/13 9:31:08
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41