13

我们正在使用一个

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<>,如果 2 个或多个线程同时to_bytes使用不同的参数调用该实例,to_bytes那么可以保证表现良好吗?

4

1 回答 1

5

因为std::wstring_convert是标准库的一部分,所以在处理来自不同线程的此类对象时,它遵循一定的规则。

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

于 2014-09-26T09:04:39.277 回答