実際、ブーストのドキュメントでこの質問に対する答えを見つけることができません。私はatof
マルチスレッド環境で使用することに少し偏執的であるため、1 つの提案は、呼び出しを に置き換えることでしたlexical_cast
。lexical_cast
スレッドセーフですか?
2 に答える
はい、boost::lexical_cast
入力文字列をまったく変更せず、複数のスレッドから同じ文字列に対して実行すると、新しい出力が生成されます。
それ自体はスレッドセーフではない を作成しstringstream
ます。つまり、同期せずにスレッド間で共有することはできませんがstringstream
、各スレッドで異なるオブジェクトを使用します。
私がそれを使用しない理由である問題lexical_cast
は、それがスローする例外の完全な無用です(コンテキストのないbad_cast)。ただし、これは別の問題であり、スレッドセーフではありません。
lexical_cast のもう 1 つの問題 (制限) は、C ロケール (クラシック) のみを使用することです。したがって、おそらく日時用の独自のファセットがあり、それに lexical_cast を使用したい場合、回避策としてクラシック ロケールを変更したくなるかもしれません。最初に行われます。
boost::spirit
実際には、ファイルを解析している場合、特定の文法がある場合、boost::serialize
または通常の istreamを使用した方がよいでしょう。実際boost::lexical_cast
、トークンごとに新しいストリームを作成するため、この目的には非常に非効率的です。
への同時呼び出しlexical_cast
は安全です。ただし、(少なくともインストールされている Boost のバージョンでは) 現在インストールされている C++ ロケールに依存することに注意してください。インストールされた C++ (および C) ロケールへのアクセスは、ユーザーが手動で同期する必要があります。こちらのデータ競合セクションを参照してください。したがって、たとえば、 と の同時呼び出しは安全lexical_cast
ではありません。std::locale::global
それにもかかわらず、インストールされている C/C++ ロケールをプログラムの起動時以外に変更することは悪い習慣と見なされています。