2010-03-09 43 views
2

在回答这个question ovanes指出:什么时候C++流对象使用互斥锁?

请注意, 的boost :: lexical_cast的是 的atoi慢得多。我还经常在 性能非关键代码中使用它。 lexical_cast的 问题是它 使用stringstream进行转换。如果您 在从 标准库将使用锁在一个互斥 每个字符多线程 environement任何流类工作被插入, 即使流对象从 单thread.Your数量由使用17个字符的 将涉及17个互斥锁 锁定时投入。 - ovanes 6月22日11时59

这引出了一个问题,什么时候<iostream>对象锁定一个互斥?这是否也适用于<sstream>的物体?如果这样可以防止?

回答

4

当前的C++标准(C++ 03)不包含任何有关多线程的内容。

因此,库如何使用互斥锁取决于具体的实现。

0

string_stream的问题是它很重。这与Mutexes无关。

我会解释为什么:

  • stringstream的使用通用接口访问底层的缓冲区,与用于文件或控制台访问:一组虚拟功能。它慢于迭代char *
  • 它使用语言环境信息,以便实际分析字符串,该字符串取决于千位分隔符的类型或取决于语言环境接口中其他类的不同类型的数字。
  • 最后它调用atoi将字符串转换为数字。

lexical_cast是非常强大的,因为它允许施放任何价值,并与atoi完成,但与动力来自价格不仅整数。

第二件事,我不认为任何string_buffer实现使用互斥体。文件流有意义但不包含字符串流。