我实际上没有在增强文档中找到这个问题的答案。我对在多线程环境中使用atof
感到有点偏执,因此有一个建议是用lexical_cast
替换呼叫。 lexical_cast
线程安全吗?
答案 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_cast
和std::locale::global
的并发调用是不安全的。尽管如此,除了在程序启动时更改已安装的C / C ++语言环境被认为是不好的做法。
答案 2 :(得分:-2)
它没有提及有关它的文档中的线程安全性的任何内容,因此安全的假设是它不是。我发现this mailing list似乎支持这个概念。