2016-11-17 54 views
1

This papersetlocale()線程不安全。有沒有任何線程安全的方法來設置語言環境。線程安全的方法setlocale()

我使用C++進行編碼,但如果語言環境有所不同,語言環境將被來自C庫的函數使用。

這基本上是我在做什麼現在:

const char* loc_old = std::setlocale(ltype, 0); 
std::setlocale(ltype, mylocale.c_str()); //change the locale 
//call some C functions 
std::setlocale(ltype, loc_old);   //restore the locale 

該解決方案必須是便攜式的,而不是>=C++11

+0

應用程序全局區域設置,no。你必須實例化離散的'std :: locale'對象,並將它們灌輸到任何地方,以便線程安全。既然C++具有'thread_local',那麼應該會發生什麼,應該只有一個默認的'thread_local'語言環境,並且新的執行'std :: thread'從它們的父線程中繼承了一個。 –

+0

@SamVarshavchik:不幸的是'thread_local'不是我的選項.. – Jahid

回答

1

有這個一個很好的答案在這裏

Is setlocale thread-safe function?

基本上你,顯然可以使用

uselocale 

至於從給予引用問題的答案之一這段代碼表明

#include <xlocale.h> 

locale_t loc = newlocale(LC_ALL_MASK, "nl_NL", NULL); 
uselocale(loc); 
freelocale(loc) 
// Do your thing 

可能有其他的方法來解決你的問題也是如此。

+0

xlocale.h是標準頭文件嗎? – Jahid

+0

可能不是。它似乎可以在Linux,Mac和Windows上使用。如果你正在爲微控制器編寫代碼,這可能沒有什麼幫助。另一種選擇是使用某種鎖,使用setlocale,然後恢復到以前的值,然後釋放鎖。 uselocale()似乎更易於使用。鎖是我提到的引用問題的接受答案。 –