阅读问题Why doesn’t C++ STL support atoi(const string& ) like functions?,我收到一条评论,警告说GCC(至少)有一个bug可以减慢频繁使用 ostringstream 的多线程应用程序。这显然是由于C ++语言环境机制需要的互斥锁。
鉴于我在全球化实践中的recent interest,我想知道是否有人可以向我解释为什么语言环境对象需要互斥锁?在需要互斥锁的区域设置中可以更改的是什么?它不应该是一个只读设施吗?
答案 0 :(得分:3)
这确实是一个实现问题,但是std::locale
有一个静态函数来检索和设置'全局'语言环境。全局语言环境定义为在标准库的几个区域中使用,这意味着某处必须有全局语言环境。
在支持线程的实现中,很可能需要通过某种锁定机制来保护此全局区域设置,以防止线程之间的同时访问导致意外行为。
由于当前标准根本没有明确地处理线程,因此它是一个集合实现选择,关于如何(或者如果)实现此锁定机制以及是否需要其他共享数据和锁定。
答案 1 :(得分:1)
答案可能是懒惰的初始化。语言环境系统背后有很多数据,很容易犯错误编码序列:
你就是。
我们中的一些人不相信整个iostream机制,只要我们可以从线程性能的角度抛出它。自1987年以来,它已经充满了不必要的锁,无法声明单个流只能在单个线程中使用。