实际上,我在boost文档中找不到这个问题的答案。我对在多线程环境中使用atof
有点偏执,所以有一个建议是用lexical_cast
替换调用。lexical_cast
线程安全吗?
是的,如果在多个线程的同一字符串上运行,boost::lexical_cast
不会以任何方式修改输入字符串,并产生新的输出。
它创建了一个stringstream
,它本身不是线程安全的,即在没有同步的情况下无法在线程之间共享,但在每个线程中使用不同的stringstream
对象。
lexical_cast
的问题是它抛出的异常(没有上下文的bad_cast)完全无用,这也是我避免使用它的原因。然而,这是一个单独的问题,而不是线程安全。
lexical_cast的另一个问题(限制)是它将只使用C语言环境(经典)。因此,如果你有自己的方面,可能是日期时间,并且你想在上面使用lexical_cast,你可能会想修改经典的区域设置作为一种变通方法,这就是它将不再是线程安全的地方,除非它在一开始就做对了。
事实上,如果你正在解析一个文件,如果它有特定的语法,你可能最好使用boost::spirit
,或者boost::serialize
,甚至是常规的istream。事实上,boost::lexical_cast
为此目的将非常低效,因为它为每个令牌创建一个新的流。
对lexical_cast
的并发调用是安全的。但请注意,它取决于(至少对于我安装的Boost版本)当前安装的C++语言环境。用户应该手动同步对已安装的C++(以及C)区域设置的访问。请参阅此处的数据竞赛部分。因此,例如,对lexical_cast
和std::locale::global
的并发调用是不安全的。尽管如此,在程序启动时以外更改已安装的C/C++区域设置被认为是不好的做法。