C ++中的标准输出流是否是线程安全的(cout,cerr,clog)?

时间:2009-09-27 11:39:16

标签: c++ thread-safety iostream

我知道当前C++中没有线程概念,但是this article is saying

  

类型安全,线程安全,便携式   日志记录机制

     

.....

     

fprintf()函数是线程安全的,   即使使用此日志也是如此   不同的线程,输出线   不会被打乱。

coutcerrclog怎么样?

我认为这个问题也适用于C ++中的所有类型的流,例如fstreamstringstream

3 个答案:

答案 0 :(得分:9)

这将是特定于实现的细节。您可以询问带有运行时库Y的编译器X是否具有线程安全的标准流,但您不能询问是否所有实现都这样做,因为允许实现在线程安全方面有所不同。这是C ++没有内置线程概念的部分原因。它是所有特定于实现的。

答案 1 :(得分:9)

本文对fprintf API的POSIX标准提出了主张。它没有说明C ++流。这是非常正确的,因为在这些流上没有这样的保证。

请注意,虽然该文章中的日志记录类使用C ++流语法,但它通过为每个日志记录事件创建和销毁的std::ostringstream对象来执行此操作,因此不会在线程之间共享。它使用fprintf将内容实际写入控制台。

Microsoft C库使一些声称符合POSIX,因此本文中的代码可能具有相当广泛的可移植性(因为许多其他流行的操作系统都符合POSIX)。但这并不意味着标准C ++流是线程安全的。

答案 2 :(得分:2)

由于当前的C ++标准甚至不承认存在称为“线程”的东西,因此它当然不会对线程安全提供任何保证。

这是所有实现定义的。