_beginthread傳遞參數時容易犯的錯誤

     下面的程序你能看出來哪裏有問題嗎?

 

 

      在某些情況下,TRACE出來的語句可能沒有文件名。

 

      原因很簡單,有些人可能已經看出來了。這個問題也是我剛開始做多線程開發時常遇到的問題。

 

      由於MyFun中的wszFileName字符串爲臨時變量,因此該字符串在MyFun返回後即被釋放。所以,對於線程函數中的語句    wcscpy_s(wszFileName, MAX_PATH, (WCHAR *)pArguments); , 在執行這句之前,MyFun函數可能已經返回,此時pArguments所指向的內存已經無效,也就得不到文件名了。

 

      這個錯誤是由於多線程的特性導致的,在單線程中,MyFun一定是在ThreadFun返回才返回的,所以就沒有這個問題,而初學多線程的人忘記考慮了這點,因此可能會犯錯。

 

      修改方法非常簡單,將MyFun中的wszFileName聲明爲全局變量即可,但這樣會導致全局變量濫用,不推薦。另一種更爲推薦的方法是將wszFileName聲明爲Static類型,如下:

 

static WCHAR wszFileName[MAX_PATH] = L"C://test.txt";

 

      這樣即保證了變量的局部性,也不會在函數退出後釋放該變量。




 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章