在WindowsEmbeddedCE下進行NativeC++開發,一次錯誤使用多執行緒的經驗教訓

橘子紅了吶發表於2017-11-12

教訓

聖誕前都忙於提交版本,編碼量大增,平均2,300行,有時候上千行。沒有做設計就直接編碼,由於都是做一些裝置相關的開發,output就是裝置的表現,沒辦法進行單元測試。在做的過程中發現了一個裝置掛死的問題,後來查出原因,是我誤用執行緒導致的,面壁思過,blog下來,以此為鑑。

 

有問題的設計

設計很簡單,4個類,一個抽象類,兩個具體裝置類和一個工廠類。

Client通過工廠類生成具體裝置類的指標,儲存到抽象類宣告的指標中。通過多型來呼叫各個具體的裝置類的方法。

由於兩個裝置類都需要用到定時任務,因此,我在抽象類裡面生成了一個工作執行緒,定期呼叫子類(具體裝置類)的多型方法執行任務。我在抽象類的建構函式裡面生成執行緒,在釋構函式裡面發訊號退出執行緒。問題就在釋構的地方,由於抽象類的釋構比具體裝置類的釋構要晚,在子類(具體裝置類)已經呼叫完釋構函式(我在子類的釋構函式裡面刪除了對具體裝置操作的指標),但是工作執行緒還沒有停止下來,可能還在呼叫子類的多型方法在執行任務,程式就可能掛死了。

 

解決方法

建立兩個protected的方法,一個用來啟動工作執行緒,一個用來停止工作執行緒,子類在刪除外部裝置指標之前先停止工作執行緒,一切執行正常。

composition over inheritance

其實更好的方法是把執行緒處理和這個類結構解耦,不通過繼承的方式來使用多執行緒處理,而是把執行緒處理類變成一個子類的一個成員,由子類來控制什麼時候使用多執行緒。

繼續面壁思過。




    本文轉自Jake Lin部落格園部落格,原文連結:http://www.cnblogs.com/procoder/archive/2009/12/15/Windows-Mobile-MultiThreading.html,如需轉載請自行聯絡原作者


相關文章