首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::lexical_cast线程安全吗?

boost::lexical_cast线程安全吗?
EN

Stack Overflow用户
提问于 2015-04-08 10:01:09
回答 2查看 610关注 0票数 2

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-08 10:34:57

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

票数 2
EN

Stack Overflow用户

发布于 2015-04-08 10:13:48

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

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

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

lexical_cast的另一个问题(限制)是它将只使用C语言环境(经典)。因此,如果您有自己的方面(可能是日期时间),并且希望在其上使用lexical_cast,您可能会倾向于修改经典的区域设置,作为解决办法,除非在一开始就这样做,否则它将不再是线程安全的。

实际上,如果您正在解析一个文件,那么如果boost::spirit具有特定的语法或boost::serialize,甚至使用常规的istream,您可能会更好地使用它。实际上,由于boost::lexical_cast为每个令牌创建了一个新流,因此它在这方面效率很低。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29511560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档