boost :: lexical_cast线程安全吗?

时间:2015-04-08 10:01:10

标签: c++ boost thread-safety atof lexical-cast

我实际上没有在增强文档中找到这个问题的答案。我对在多线程环境中使用atof感到有点偏执,因此有一个建议是用lexical_cast替换呼叫。 lexical_cast线程安全吗?

3 个答案:

答案 0 :(得分:3)

是的,boost::lexical_cast不会以任何方式修改输入字符串,如果在多个线程的相同字符串上运行,则会产生新的输出。

它创建一个stringstream,它本身不是线程安全的,即在没有同步的情况下不能在线程之间共享,但会在每个线程中使用不同的stringstream对象。

我与lexical_cast的问题就是我避免使用它的原因是它抛出的异常完全没用(没有上下文的bad_cast)。然而,这是一个单独的问题,而不是线程安全。

lexical_cast的另一个问题(限制)是它只使用C语言环境(经典)。因此,如果您有自己的方面,可能是日期时间,并且您想在其上使用lexical_cast,您可能会想要将经典语言环境修改为变通方法,这就是它将停止为线程安全的地方,除非它是一开始就完成了。

实际上,如果你正在解析文件,如果它有特定的语法或boost::spirit甚至是常规的istream,你可能最好使用boost::serialize。事实上,boost::lexical_cast为此目的效率极低,因为它为每个令牌创建了一个新的流。

答案 1 :(得分:2)

同时拨打lexical_cast是安全的。但请注意它依赖于(至少对于我安装的Boost版本)当前安装的C ++语言环境。应该由用户手动同步对已安装的C ++(以及C)语言环境的访问。请参阅数据竞赛部分here。因此,例如,对lexical_caststd::locale::global的并发调用是不安全的。尽管如此,除了在程序启动时更改已安装的C / C ++语言环境被认为是不好的做法。

答案 2 :(得分:-2)

它没有提及有关它的文档中的线程安全性的任何内容,因此安全的假设是它不是。我发现this mailing list似乎支持这个概念。