boost::lexical_cast 是线程安全的吗?

Is boost::lexical_cast thread-safe?

实际上我在 boost 文档中找不到这个问题的答案。我对在多线程环境中使用 atof 有点偏执,所以一个建议是用 lexical_cast 替换调用。 lexical_cast 是线程安全的吗?

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

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

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

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

实际上,如果你正在解析一个文件,如果它有特定的语法,你最好使用 boost::spiritboost::serialize 甚至常规的 istream。事实上 boost::lexical_cast 对于这个目的来说效率非常低,因为它为每个令牌创建一个新流。

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