1. 程式人生 > >VS C++ 並發編程

VS C++ 並發編程

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++ 並發編程