我们正在使用
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
在我们的记录器中,从遗留组件获取UTF-16字符串并将其转换为我们写入日志的UTF-8。转换器在每次转换时都会被实例化,我们就这样做了
auto utf8string = converter.to_bytes(utf16string);
这是在我们代码的一个非常密集和多线程的部分完成的,我想重用一个转换器实例,但是看到std::wstring_convert
暴露了一个“状态”,我是担心to_bytes
不是线程安全的,并且通过重用相同的实例可以获得的任何收益都会因为需要过多的锁定而丢失(在这种情况下我不会共享实例)。
那么,std::wstring_convert<>::to_bytes
线程安全吗?
编辑:澄清我真正的问题:给定std::wstring_convert<>
的一个实例,如果两个或多个线程同时使用不同的参数调用该to_bytes
的实例,to_bytes
是否保证表现良好?
答案 0 :(得分:4)
因为std::wstring_convert
是标准库的一部分,所以当涉及从不同的线程处理这种类型的对象时,它遵循certain rules。
特别是,因为to_bytes
和from_bytes
重载都是非const
,所以不能在没有同步的情况下在不同线程的任何一个特定对象上使用这些成员。这是有道理的,因为codecvt转换通常使用state_type
对象。在没有同步的情况下使用它会导致灾难。