11

我知道当前没有线程的概念C++,但这篇文章是说

一种类型安全、线程安全、可移植的 日志机制

......

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

和怎么cout样?cerrclog

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

4

3 回答 3

9

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

于 2009-09-27T11:48:04.177 回答
9

这篇文章声明了fprintfAPI 的 POSIX 标准。它没有说明 C++ 流。这是完全正确的,因为这些流上没有这样的保证。

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

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

于 2009-09-27T11:54:14.340 回答
2

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

这都是实现定义的。

于 2009-09-27T12:11:12.637 回答