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
アプリケーショングローバルロケール、いいえ。スレッドセーフなためには、個別の 'std :: locale'オブジェクトをインスタンス化し、どこにでもそれらを埋め込む必要があります。 C++は 'thread_local'を持っているので、単にデフォルトの' thread_local'ロケールがあり、新しい実行 'std :: thread'は親スレッドから継承しなければなりません。 –
@SamVarshavchik:残念ながら 'thread_local'は私にとってはオプションではありません。 – Jahid