setlocale 多執行緒呼叫引發程式crash
阿新 • • 發佈:2018-11-14
最近的一個專案,由於要讀寫中文文字,所以使用了以下程式碼:
-
char* old_locale = _strdup(setlocale(LC_CTYPE, NULL));
-
setlocale(LC_CTYPE, "chs");
-
CStdioFile file;
-
//CFile::modeCreate:以新建方式開啟,如果檔案不存在,新建;如果檔案已存在,把該檔案長度置零,即清除檔案原有內容
-
if (file.Open(strFilePath, CFile::modeCreate | CFile::modeReadWrite))
-
{
-
//檔案讀寫
-
}
-
setlocale(LC_CTYPE, old_locale); //還原語言區域的設定
-
free(old_locale);//還原區域設定
即呼叫setlocale函式,設定區域,正常讀寫中文。
但是如果在多執行緒裡面讀寫檔案,執行以上程式碼,程式則可能會crash。
解決方法:
與setlocale函式相關的還有一個函式,_configthreadlocale:
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE)使setlocale只針對當前執行緒起作用
_configthreadlocale(_DISABLE_PER_THREAD_LOCALE)使setlocale對所有執行緒的設定都有用(預設值)
預設情況下,呼叫了setlocale函式設定了區域,即對當前程序的所有執行緒都有效,所以只需在主執行緒裡面呼叫一次setlocale,其它執行緒無需再重複呼叫。
setlocale函式還需要注意的一點就是:
setlocale只能在各自的執行時庫裡生效