1. 程式人生 > >setlocale 多執行緒呼叫引發程式crash

setlocale 多執行緒呼叫引發程式crash

最近的一個專案,由於要讀寫中文文字,所以使用了以下程式碼:

 

 
  1. char* old_locale = _strdup(setlocale(LC_CTYPE, NULL));

  2. setlocale(LC_CTYPE, "chs");

  3. CStdioFile file;

  4. //CFile::modeCreate:以新建方式開啟,如果檔案不存在,新建;如果檔案已存在,把該檔案長度置零,即清除檔案原有內容

  5. if (file.Open(strFilePath, CFile::modeCreate | CFile::modeReadWrite))

  6. {

  7. //檔案讀寫

  8. }

  9. setlocale(LC_CTYPE, old_locale); //還原語言區域的設定

  10. free(old_locale);//還原區域設定


即呼叫setlocale函式,設定區域,正常讀寫中文。

 

但是如果在多執行緒裡面讀寫檔案,執行以上程式碼,程式則可能會crash。

解決方法:

與setlocale函式相關的還有一個函式,_configthreadlocale:

 

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE)使setlocale只針對當前執行緒起作用

_configthreadlocale(_DISABLE_PER_THREAD_LOCALE)使setlocale對所有執行緒的設定都有用(預設值)

 

預設情況下,呼叫了setlocale函式設定了區域,即對當前程序的所有執行緒都有效,所以只需在主執行緒裡面呼叫一次setlocale,其它執行緒無需再重複呼叫。

 

setlocale函式還需要注意的一點就是:

setlocale只能在各自的執行時庫裡生效