2

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

4

2 回答 2

3

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

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

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

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

实际上,如果您正在解析一个文件,那么boost::spirit如果它具有特定的语法boost::serialize甚至是常规的 istream,您可能会更好。实际上boost::lexical_cast,为此目的效率非常低,因为它为每个令牌创建一个新流。

于 2015-04-08T10:13:48.600 回答
2

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.

于 2015-04-08T10:34:57.577 回答