2

実際、ブーストのドキュメントでこの質問に対する答えを見つけることができません。私はatofマルチスレッド環境で使用することに少し偏執的であるため、1 つの提案は、呼び出しを に置き換えることでしたlexical_castlexical_castスレッドセーフですか?

4

2 に答える 2

3

はい、boost::lexical_cast入力文字列をまったく変更せず、複数のスレッドから同じ文字列に対して実行すると、新しい出力が生成されます。

それ自体はスレッドセーフではない を作成しstringstreamます。つまり、同期せずにスレッド間で共有することはできませんがstringstream、各スレッドで異なるオブジェクトを使用します。

私がそれを使用しない理由である問題lexical_castは、それがスローする例外の完全な無用です(コンテキストのないbad_cast)。ただし、これは別の問題であり、スレッドセーフではありません。

lexical_cast のもう 1 つの問題 (制限) は、C ロケール (クラシック) のみを使用することです。したがって、おそらく日時用の独自のファセットがあり、それに lexical_cast を使用したい場合、回避策としてクラシック ロケールを変更したくなるかもしれません。最初に行われます。

boost::spirit実際には、ファイルを解析している場合、特定の文法がある場合、boost::serializeまたは通常の istreamを使用した方がよいでしょう。実際boost::lexical_cast、トークンごとに新しいストリームを作成するため、この目的には非常に非効率的です。

于 2015-04-08T10:13:48.600 に答える
2

への同時呼び出しlexical_castは安全です。ただし、(少なくともインストールされている Boost のバージョンでは) 現在インストールされている C++ ロケールに依存することに注意してください。インストールされた C++ (および C) ロケールへのアクセスは、ユーザーが手動で同期する必要があります。こちらのデータ競合セクションを参照してください。したがって、たとえば、 と の同時呼び出しは安全lexical_castではありません。std::locale::globalそれにもかかわらず、インストールされている C/C++ ロケールをプログラムの起動時以外に変更することは悪い習慣と見なされています。

于 2015-04-08T10:34:57.577 に答える