C++多线程下出现内存越界问题总结
工作中遇到这样一个问题,某个多级流水多线程的程序,在压力测试下会偶现segmentation fault11错误,错误出现在运行类函数的地方,而后排查后发现是由于多线程争抢导致类被析构后才走入判断,导致出现内存越界。
class A { bool error_; int Reply(); }
Task1.cpp
if (a->process1() != 0) a->error_ = true; if (!a->error_) { do { if (a->process2() != 0) { a->error_ = true; break; }
put_next(a); }while(0); } if (a->error_) { a->Reply(); }
代码流程如上:
1、多级流水:Task1->Task2->Task3,且每个Task内有多个线程
2、Task1处理完毕后将a放入Task2的消息队列,此时由于CPU争抢导致Task1被卡住,未能继续执行
3、Task2、Task3依次处理完成后,a消息返回给上级模块,delete a
4、此时Task1获取到CPU资源,继续执行
5、而a已被析构,Task1内的a仍旧保存原有指针地址
6、由于a已被析构,a->error_不可预知,进入判断,走到a->Reply(),然而a已析构,所以崩溃。
总结:多线程程序中线程内和线程间的执行顺序不可预知,要确保每个线程内只能有一个终点,尽量避免GOTO或多次判断导致出现逻辑分支的情况。
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了