请解释区域设置中对互斥锁的需求

时间:2009-11-20 15:51:05

标签: c++ localization internationalization locale mutex

阅读问题Why doesn’t C++ STL support atoi(const string& ) like functions?,我收到一条评论,警告说GCC(至少)有一个bug可以减慢频繁使用 ostringstream 的多线程应用程序。这显然是由于C ++语言环境机制需要的互斥锁。

鉴于我在全球化实践中的recent interest,我想知道是否有人可以向我解释为什么语言环境对象需要互斥锁?在需要互斥锁的区域设置中可以更改的是什么?它不应该是一个只读设施吗?

2 个答案:

答案 0 :(得分:3)

这确实是一个实现问题,但是std::locale有一个静态函数来检索和设置'全局'语言环境。全局语言环境定义为在标准库的几个区域中使用,这意味着某处必须有全局语言环境。

在支持线程的实现中,很可能需要通过某种锁定机制来保护此全局区域设置,以防止线程之间的同时访问导致意外行为。

由于当前标准根本没有明确地处理线程,因此它是一个集合实现选择,关于如何(或者如果)实现此锁定机制以及是否需要其他共享数据和锁定。

答案 1 :(得分:1)

答案可能是懒惰的初始化。语言环境系统背后有很多数据,很容易犯错误编码序列:

  1. 采取锁定
  2. 检查初始化
  3. 如果需要,请阅读数据
  4. 释放锁定
  5. 你就是。

    我们中的一些人不相信整个iostream机制,只要我们可以从线程性能的角度抛出它。自1987年以来,它已经充满了不必要的锁,无法声明单个流只能在单个线程中使用。