網路城邦
上一篇 回創作列表 下一篇  字體:
經驗分享:程式會閃退,問題一定是出在背景執行緒!
2022/10/23 11:00:44瀏覽2364|回應0|推薦10

我是以開發軟體維生,主要產品是高速動態辨識車牌的軟體。辨識軟體的運算量本來就很大了,還要高速辨識到可以趕得上車水馬龍的速度?一秒鐘要辨識約20次的街景影像,也就是50ms的時間辨識一次。但是老實說,一張約一百多萬畫素的街景影像,要辨識出上面出現的「所有」車牌,即使我的辨識核心效率超高,也需要大約半秒鐘!那不是一秒鐘只能辨識兩張嗎?

如果你的電腦是「單核心」買我的軟體確實是這麼慢的!但是現在哪有這種電腦啊?我的程式可以偵測到你用的是幾個處理器的電腦,然後就用多執行緒程式做平行運算。就像理髮廳有多個座椅同時替多人理髮一樣,理一個頭半小時的話,單座的理髮廳一小時理兩個人!四座椅的呢?就可以理八個人了!

現在的電腦至少都是四到八核心了!1216核心的也不算罕見,所以我的軟體才能達到那麼高的辨識速度,就是平行運算的總辨識流量增加了啦!所以辨識速度其實是軟體與硬體各司其職下總和的結果,我的軟體可以努力的就是精進演算法的效率,讓計算少一點,也快一點!還有就是善用多執行緒平行運算了!

但是分散平行運算會讓程式的流程變得複雜,多數分散出去做平行運算的資料,最終還是必須回到主程式做彙整統計得到最終的結果。所以資料流需要分分合合,每個獨立辨識的時間也不一樣,就是所謂的非同步現象,會讓寫程式的人很頭痛!

這情形很像一個軟體專案的程式,如果由一個人完全處理其實比較容易,分給幾個人各做一部份呢?那就有很多會議開不完了!如果處理的不好不夠聰明,就會損失很多效率,譬如一個執行緒出錯卡關大家就一起等他完成,有必要嗎?讓遲到的人上下一班的課不行嗎?等等巧思彈性安排就可以讓程式更快更順,但寫程式的人就比較累了!

不僅如此,每一個程式同一時間只能有一個主執行緒,其他執行緒就都必須到背景執行,稱為背景執行緒!對於作業系統來說,當程式出錯當掉時,會代為顯示錯誤訊息框,加減告訴使用者發生了甚麼事情?但是如果程式錯誤出現在背景執行緒呢?這種轉告錯誤訊息的服務就沒那麼好了!

結果就是我們這種軟體開發者的噩夢:程式閃退了!就是沒有任何訊息或記錄,本來好好執行中的程式忽然消失了!當客戶報告這種災難時,我們根本無法知道出事的原因!就只能用猜測的方式,東摸西改,也不知道改到病灶了沒有?心理壓力很大的!

但是至少多年的經驗可以讓我跟同行分享:閃退一定是因為背景執行緒出現的錯誤!絕對不是主執行緒的錯誤!而且這種錯誤有九成來自不同的執行緒想使用同一資源時的衝突!希望此經驗能讓後進減少一些工作量,早點找到病灶。

( 心情隨筆工作職場 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=yccsonar&aid=177323682