VS C++ 併發編程

1.VS2012及以上版本,支持C++11 thread類的併發編程。html

相關材料能夠參考博客:http://www.cnblogs.com/rangozhang/p/4468754.html編程

2.但對其以前的版本,可採用如下方式,實現類成員函數建立子線程實現併發。併發

  首先需實現線程類的run函數,故定義了線程類的頭文件和其對應的函數實現,具體如圖1,2所示:函數

圖1 線程類的頭文件線程

圖2 線程類的實現文件指針

  注意到繼承的DerivedThread類,只需將併發執行的函數寫在其對應的run()函數內便可。htm

  其中須要注意的是:子線程運行結束的條件。下面以一個項目爲例,進一步說明其重要性。blog

  上述截圖中,類成員TempGrayImg是已知的輸入圖像,TempOptMMStir是未知的目標掩碼圖像,以前錯誤的作法是:以目標掩碼圖像TempOptMMStir非零像素點的個數是否爲零做爲當前子線程是否結束的標誌,但這其中的問題是,若當前線程執行了一部分,TempOptMMStir掩碼圖像出現部分目標時,其非零像素個數已經大於零,但實際上還未獲得最終的目標掩碼圖像,這就可能致使子線程還未執行完,主線程便提早結束休眠,開始執行,從而致使一系列的錯誤,最明顯的錯誤是相關內存資源的提早釋放,致使還未執行完成的子線程訪問了已經釋放資源的相關變量,進而出現錯誤,即出現野指針(對於圖像的表徵是:圖像指針不爲NULL,但其長度和寬度爲零或無效數值)。繼承

圖3內存

  圖3從上至下的第三個紅色矩形中,便是線程結束的判斷方式。上面兩個紅色矩形是還未實現成功的C++ Thread類進行併發運行的方法,後面需進一步研究改進。

相關文章
相關標籤/搜索