VS C++ 並發編程
阿新 • • 發佈:2017-06-20
png com 可能 方法 null 其中 博客 是否 判斷
1.VS2012及以上版本,支持C++11 thread類的並發編程。
相關材料可以參考博客:http://www.cnblogs.com/rangozhang/p/4468754.html
2.但對其之前的版本,可采用以下方式,實現類成員函數創建子線程實現並發。
首先需實現線程類的run函數,故定義了線程類的頭文件和其對應的函數實現,具體如圖1,2所示:
圖1 線程類的頭文件
圖2 線程類的實現文件
註意到繼承的DerivedThread類,只需將並發執行的函數寫在其對應的run()函數內即可。
其中需要註意的是:子線程運行結束的條件。下面以一個項目為例,進一步說明其重要性。
上述截圖中,類成員TempGrayImg是已知的輸入圖像,TempOptMMStir是未知的目標掩碼圖像,之前錯誤的做法是:以目標掩碼圖像TempOptMMStir非零像素點的個數是否為零作為當前子線程是否結束的標誌,但這其中的問題是,若當前線程執行了一部分,TempOptMMStir掩碼圖像出現部分目標時,其非零像素個數已經大於零,但實際上還未得到最終的目標掩碼圖像,這就可能導致子線程還未執行完,主線程便提前結束休眠,開始執行,從而導致一系列的錯誤,最明顯的錯誤是相關內存資源的提前釋放,導致還未執行完成的子線程訪問了已經釋放資源的相關變量,進而出現錯誤,即出現野指針(對於圖像的表征是:圖像指針不為NULL,但其長度和寬度為零或無效數值)。
圖3
圖3從上至下的第三個紅色矩形中,即是線程結束的判斷方式。上面兩個紅色矩形是還未實現成功的C++ Thread類進行並發運行的方法,後面需進一步研究改進。
VS C++ 並發編程