我知道当前C++
中没有线程概念,但是this article is saying:
类型安全,线程安全,便携式 日志记录机制
.....
fprintf()
函数是线程安全的, 即使使用此日志也是如此 不同的线程,输出线 不会被打乱。
cout
,cerr
和clog
怎么样?
我认为这个问题也适用于C ++中的所有类型的流,例如fstream
和stringstream
。
答案 0 :(得分:9)
这将是特定于实现的细节。您可以询问带有运行时库Y的编译器X是否具有线程安全的标准流,但您不能询问是否所有实现都这样做,因为允许实现在线程安全方面有所不同。这是C ++没有内置线程概念的部分原因。它是所有特定于实现的。
答案 1 :(得分:9)
本文对fprintf
API的POSIX标准提出了主张。它没有说明C ++流。这是非常正确的,因为在这些流上没有这样的保证。
请注意,虽然该文章中的日志记录类使用C ++流语法,但它通过为每个日志记录事件创建和销毁的std::ostringstream
对象来执行此操作,因此不会在线程之间共享。它使用fprintf
将内容实际写入控制台。
Microsoft C库使一些声称符合POSIX,因此本文中的代码可能具有相当广泛的可移植性(因为许多其他流行的操作系统都符合POSIX)。但这并不意味着标准C ++流是线程安全的。
答案 2 :(得分:2)
由于当前的C ++标准甚至不承认存在称为“线程”的东西,因此它当然不会对线程安全提供任何保证。
这是所有实现定义的。