2016-11-17 7 views
1

This paperは、setlocale()はスレッドが安全ではないと言います。ロケールを設定するスレッドセーフな方法はありますか?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

アプリケーショングローバルロケール、いいえ。スレッドセーフなためには、個別の '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()は使いやすいようです。ロックは、私が言及した参照された質問に対する受け入れられた答えです。 –

関連する問題