工做中遇到這樣一個問題,某個多級流水多線程的程序,在壓力測試下會偶現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或屢次判斷致使出現邏輯分支的狀況。隊列