什么时候c ++流对象使用互斥锁?

时间:2010-03-09 20:17:15

标签: c++ locking mutex iostream

在这个question ovanes状态的答案中:

  

请注意   boost :: lexical_cast的速度要慢得多   的atoi。我也经常使用它   性能非关键代码。该   lexical_cast的问题在于它   使用stringstream进行转换。如果   你正在使用多线程   environement来自的任何流类   标准库将使用互斥锁上的锁   对于插入的每个字符,   即使使用了流对象   单个线程。包含您的数字   17个字符将涉及17个互斥   锁定时放入流中。 - ovanes   6月22日11:59

问题是,<iostream>对象何时锁定互斥锁?这对<sstream>的对象也是如此吗?如果是这样可以预防?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

string_stream的问题在于它很重。它与互斥锁无关。

我会解释原因:

  • stringstream使用通用接口访问底层缓冲区,与用于文件或控制台访问相同:一组虚函数。它慢于char *
  • 的迭代速度
  • 它使用区域设置信息,因此您实际上可以解析依赖于千位分隔符类型的字符串或为区域设置界面中的其他类获取的不同类型的数字。
  • 最后调用atoi将字符串转换为数字。

lexical_cast非常强大,因为它允许转换任何值,而不是仅使用atoi转换为整数,但是功率会降价。

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