2013-05-20 14 views
9

私たちは、レガシー・コンポーネントからUTF-16文字列を取得し、我々はログに書き込むことをUTF-8に変換私たちのロガーでstd :: wstring_convertのメンバー関数は安全ですか?

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

を使用しています。コンバータは、私たちはその上に、各変換上でインスタンスを取得します

auto utf8string = converter.to_bytes(utf16string); 

、これが我々のコードのかなりの集中とマルチスレッドの部分で行われ、私は、コンバータの再使用のインスタンスたいのですが、私はto_bytesがスレッドセーフではなく、同じインスタンスを再利用することで得ることができる利益が、必要とされる過度のロックによって失われてしまうのではないかと心配しています(その場合、私はとにかくインスタンスを共有する)。

したがって、std::wstring_convert<>::to_bytesはスレッドセーフですか?

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

+0

@LucDanton:重要な部分の2行の要約(「constスレッドセーフ」を意味する)を答えとして残りの部分にリンクを追加することは「許可」されていると思います。 –

+0

上記のコメントの明確化 - 「constはスレッドセーフを意味します」は「constはスレッドセーフを意味し、to_bytesはconstではなく、インスタンス状態を変更する可能性があります」 –

+0

@LucDanton:duh!気づいてくれてありがとう - それを変更しました。もちろん、それは 'to_bytes'(facepalm)です。 –

答えて

1

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

、両方to_bytesfrom_bytes過負荷がconst非あるので、同期せず、異なるスレッドからいずれか1つの特定のオブジェクト上でメンバーを使用することは不可能です。コーデック変換では通常、state_typeオブジェクトを使用するため、これは意味があります。同期せずに使用すると災害につながります。

関連する問題