13

を使用しています

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;

レガシー コンポーネントから UTF-16 文字列を取得し、ログに書き込む UTF-8 に変換する私たちのロガーで。コンバーターは、変換ごとにインスタンス化されます。

auto utf8string = converter.to_bytes(utf16string);

これは、コードのかなり集中的でマルチスレッド化された部分で行われ、コンバーターの 1 つのインスタンスを再利用したいのですが、それがstd::wstring_convert「状態」を公開していることを見て、to_bytesスレッドセーフではないのではないかと心配しています。同じインスタンスを再利用することで得られる利益は、その後必要となる過度のロックによって失われます (その場合、とにかくインスタンスを共有しません)。

それで、std::wstring_convert<>::to_bytesスレッドセーフですか?

編集:私が本当に求めていることの明確化: の1つのインスタンスが与えられたstd::wstring_convert<>場合、2つ以上のスレッドto_bytesが異なる引数でそのインスタンスを同時に呼び出す場合、to_bytes適切に動作することが保証されますか?

4

1 に答える 1

5

std::wstring_convertは標準ライブラリの一部であるため、異なるスレッドからそのようなタイプのオブジェクトを処理する場合、特定の規則に従います。

特に、to_bytesfrom_bytesオーバーロードの両方が non-constであるため、同期せずに異なるスレッドから特定の 1 つのオブジェクトでこれらのメンバーを使用することはできません。codecvt 変換は通常、オブジェクトを使用するため、これは理にかなっていstate_typeます。同期せずに使用すると、災害が発生します。

于 2014-09-26T09:04:39.277 に答える