下面的程序你能看出來哪裏有問題嗎?
在某些情況下,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";
這樣即保證了變量的局部性,也不會在函數退出後釋放該變量。