std :: wstring_convert线程的成员函数是否安全?

时间:2013-05-20 07:02:42

标签: c++ multithreading stl

我们正在使用

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是否保证表现良好?

1 个答案:

答案 0 :(得分:4)

因为std::wstring_convert是标准库的一部分,所以当涉及从不同的线程处理这种类型的对象时,它遵循certain rules

特别是,因为to_bytesfrom_bytes重载都是非const,所以不能在没有同步的情况下在不同线程的任何一个特定对象上使用这些成员。这是有道理的,因为codecvt转换通常使用state_type对象。在没有同步的情况下使用它会导致灾难。