Re: [問題] 請問多執行緒這樣寫是否有問題?

作者: benbchung (距離...是妳經過我的時候)   2016-05-11 20:34:28
我重新修改了一下程式,改成使用單一執行緒計算。
仍然是一樣的異常狀況。
我程式寫法大致如下(省略部分段落)
1.
用一個主執行緒重複乎叫MutiProcess這個類別的物件做計算(如下圖)

2.
MutiProcess這個類別再創建ProcessClass 這個類別的物件(名稱ImageProcess,如下圖)

主執行緒while迴圈重複跑數百數千次之後(頻率不一定),會出現異常。
幾乎都是ProcessClass裡面的私有的影像BUFFER被清空(該buffer上一行還很正常使用)
或是ProcessClass裡面的私有影像buffer在該某一function中突然變成其他function
才會做的處理狀況(異常時我用VC的外掛工具看Buffer內容發現的)。
因為ProcessClass這個類太龐大了,暫時不貼。
想先請板上的前輩幫我看一下,我這樣一直new class做計算的方式是否有問題?
作者: Litfal (Litfal)   2016-05-11 21:51:00
你這個MultiProcess應該要試著重用或是直接使用原始那一份 tempProcessImage的內容,雖然我沒看出哪裡用到XDDD
作者: benbchung (距離...是妳經過我的時候)   2016-05-11 23:34:00
請問MutiProcess試著重用是什麼意思?重新宣告嗎?
作者: Litfal (Litfal)   2016-05-14 10:47:00
當一個物件占用資源時,就應該試著重新使用他,而不是用完就丟,然後new新的。可以簡單地重新使用,或是用Pool的概念去管理。否則每次都調用與釋放資源,不只效能差,對記體也有不良影響。
作者: benbchung (距離...是妳經過我的時候)   2016-05-17 22:17:00
謝謝,收穫很多!
作者: VVll (李奧納多皮卡丘)   2016-05-21 03:56:00
看起來是把MainImage中的每個檔案丟到DefectFind做影像處理但看起來MutiProcessㄧ份就好了 不需要產生跟MainImage相同的物件數目 因為你是單緒 且做完工作就重建ㄧ次另外你的30 應該共用 Global.MaxThreadLength這個值另外你說Buffer會出錯的情況 num是否都不同
作者: new1011 (AJAY)   2016-05-21 09:38:00
如果都確認變數獨立,就要確認是否底層方法執行緒安全
作者: disabledman (m.m.)   2016-06-02 21:13:00
看來是memory leak問題

Links booklink

Contact Us: admin [ a t ] ucptt.com