开发者

When do c++ stream objects use mutexes?

In the answer to this question ovanes states:

Please be aware that boost::lexical_cast is much slower as atoi. I also use it very often in a performance non-critical code. The problem with lexical_cast is that it uses stringstream for conversion. If you are working in a multi-threaded environement any stream class from the standard lib will use locks on a mutex for every character being inserted, even if the stream object is used from a single thread.Your number consisting of 17 chars will involve 17 mutex locks when put into stream. – ovanes Jun 22 at 11:59

Which begs the question, when do <iostream开发者_开发知识库> objects lock a mutex? Is this true for objects from <sstream> as well? If so can this be prevented?


The current C++ standard (C++03) does not contain anything about multi-threading.

Because of this, how a library uses mutexes would depend on the specific implementation.


The issue with string_stream is that it is quite heavy. And it is not related to Mutexes.

And I'll explain why:

  • stringstream uses generic interface to access underlying buffer, same as used for files or for console access: a set of virtual functions. It is slower then iterating over char *
  • it Uses locale information so you may actually parse string that depends on type of thousands separators or different types of digits that are fetched for other class in locale interface.
  • And finally it calls atoi to convert the string to number.

lexical_cast is very powerful because it allows to cast any value and not integer only as done with atoi but with power comes prices.

Second thing, I don't think that any string_buffer implementation uses mutexes. File stream has sense in it but not string stream.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜