在WindowsEmbeddedCE下進行NativeC++開發,一次錯誤使用多執行緒的經驗教訓
教訓
聖誕前都忙於提交版本,編碼量大增,平均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,如需轉載請自行聯絡原作者
相關文章
- WindowsMobile下如果進行NativeC++多執行緒的開發WindowsC++執行緒
- JAVA多執行緒下高併發的處理經驗Java執行緒
- 使用執行緒執行框架的一次經歷執行緒框架
- Linux 的多執行緒程式設計的高效開發經驗Linux執行緒程式設計
- 大規模執行 Apache Airflow 的經驗教訓 - shopifyApacheAI
- IOS下使用多執行緒iOS執行緒
- 使用委託開啟多執行緒(多執行緒深入)執行緒
- 多執行緒同步的開發執行緒
- 請教執行錯誤提示
- C#多執行緒開發-執行緒同步 02C#執行緒
- C#多執行緒開發-執行緒池03C#執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- 實驗--多執行緒執行緒
- iPhone開發進階(11)--- 多執行緒的使用與注意事項iPhone執行緒
- C#多執行緒開發-執行緒基礎 01C#執行緒
- iOS 開發中的多執行緒iOS執行緒
- java多執行緒之執行緒的基本使用Java執行緒
- 多執行緒-執行緒組的概述和使用執行緒
- 多執行緒-執行緒池的概述和使用執行緒
- 經驗分享:HelloFresh在生產中執行Istio的經驗教訓 - Craig HuberAI
- 多執行緒環境下的DateFormat 使用執行緒ORM
- 多執行緒下的list執行緒
- 【iOS開發】多執行緒 - 概述iOS執行緒
- 一次二次開發中的經驗與教訓(一)
- 一次二次開發中的經驗與教訓(二)
- 多執行緒使用執行緒
- 機器學習的教訓:5家公司分享的錯誤經驗機器學習
- Chrome 開啟多執行緒下載Chrome執行緒
- 在Vb下實現多執行緒 (轉)執行緒
- 【多執行緒與高併發】從一則招聘資訊進入多執行緒的世界執行緒
- Java 多執行緒的一次整理Java執行緒
- OD除錯多執行緒除錯執行緒
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- iOS多執行緒的使用iOS執行緒
- 多執行緒:barrier的使用執行緒
- 進階Java多執行緒Java執行緒
- 多執行緒下的下載原理執行緒