工做中遇到这样一个问题,某个多级流水多线程的程序,在压力测试下会偶现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(); }
代码流程如上:函数
一、多级流水:Task1->Task2->Task3,且每一个Task内有多个线程测试
二、Task1处理完毕后将a放入Task2的消息队列,此时因为CPU争抢致使Task1被卡住,未能继续执行spa
三、Task二、Task3依次处理完成后,a消息返回给上级模块,delete a线程
四、此时Task1获取到CPU资源,继续执行指针
五、而a已被析构,Task1内的a仍旧保存原有指针地址code
六、因为a已被析构,a->error_不可预知,进入判断,走到a->Reply(),然而a已析构,因此崩溃。blog
总结:多线程程序中线程内和线程间的执行顺序不可预知,要确保每一个线程内只能有一个终点,尽可能避免GOTO或屡次判断致使出现逻辑分支的状况。队列