std::to_string线程安全吗?

15
我想使用std::to_string将整数类型转换为字符串,但我看到了这段话:

std::to_string依赖于std::locale进行格式化,因此从多个线程同时调用std::to_string可能导致部分调用的串行化。

但我在这个主题上找不到其他信息,谷歌也没有搜到任何东西,MSDN也是如此。如果它很安全,它是如何安全的?


8
这段引用并没有说明它不是线程安全的,只是多次调用可能不会同时运行。这是一个性能问题,而不是安全问题。 - NathanOliver
1
@Nathan 请问std::locale是线程安全的吗? - user2100815
1
@NeilButterworth 其中的某些部分并不是线程安全的。例如,setlocale 就不是线程安全的,因此如果 std::to_string 调用了它,可能会使用互斥锁来确保多个调用不会竞争。 - NathanOliver
1
@NathanOliver 如果 std::to_string 涉及锁定互斥量,那似乎相当丑陋和性能不佳。 - Nir Friedman
1
关于 std::locale 类本身:它是不可变的,因此不存在读/写竞争的可能性。 - Revolver_Ocelot
显示剩余5条评论
1个回答

7

std::to_string的行为类似于调用sprintf(参见[string.conversions]/7),而sprintf的行为取决于全局区域设置,这可以通过setlocale(或std::locale::global,它内部调用setlocale)进行修改。

[clocale.syn]/2中的措辞似乎意味着std::to_string是线程安全的,因为它不允许setlocalestd::to_stringsprintf发生数据竞争。


感谢您提供详细的答案。 - roybj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接