我实际上未能在 boost 文档中找到这个问题的答案。我对atof
在多线程环境中使用有点偏执,所以一个建议是将调用替换为lexical_cast
. lexical_cast
线程安全吗?
2 回答
是的,boost::lexical_cast
不以任何方式修改输入字符串,如果在多个线程的同一字符串上运行,则会产生新的输出。
它创建了一个stringstream
本身不是线程安全的,即不能在没有同步的情况下在线程之间共享,但会stringstream
在每个线程中使用不同的对象。
我遇到的问题lexical_cast
是我避免使用它的原因是它抛出的异常完全无用(没有上下文的bad_cast)。然而,这是一个单独的问题,而不是线程安全。
lexical_cast 的另一个问题(限制)是它只会使用 C 语言环境(经典)。因此,如果您有自己的方面,可能是日期时间,并且您想在其上使用 lexical_cast,您可能很想修改经典语言环境作为解决方法,这就是它将停止线程安全的地方,除非它是一开始就做好了。
实际上,如果您正在解析一个文件,那么boost::spirit
如果它具有特定的语法boost::serialize
甚至是常规的 istream,您可能会更好。实际上boost::lexical_cast
,为此目的效率非常低,因为它为每个令牌创建一个新流。
Concurrent calls to lexical_cast
are safe. But pay attention that it depends on (at least for my installed version of Boost) the currently installed C++ locale. Access to the installed C++ (as well as C) locale should be synchronized manually by the user. See the Data races section here. So, for example, concurrent calls to lexical_cast
and std::locale::global
are unsafe. Despite this, it is considered bad practice to change the installed C/C++ locale other than at program startup.