14

一个简单的问题:

我需要在我的程序中添加一些日志记录。

如果两个进程在同一个文件上使用“fwrite”但不是同一个文件描述符,则写入的日志消息将是原子的或混合的。有长度限制吗?

它是定义的 ANSI-C 行为还是定义的实现?如果稍后在 MacOSX、Linux 和 Windows MSVC 上是什么?

4

4 回答 4

18

在做了一些研究之后,我在这个链接中发现了以下内容:

POSIX 标准要求 C stdio FILE* 操作是原子的。符合 POSIX 的 C 库(例如,在 Solaris 和 GNU/Linux 上)有一个内部互斥锁来序列化 FILE*s 上的操作。

看起来调用应该是原子的,但这取决于您的平台。在同一个链接中,还有另一段让您认为程序员应该小心:

因此,对于 3.0,“多线程对 I/O 是否安全”的问题必须用“您的平台的 C 库对 I/O 是否线程安全”来回答?有些是默认的,有些不是;许多提供 C 库的多种实现,并在线程安全性和效率方面进行了不同的权衡。你,程序员,总是需要照顾多个线程。

另外,由于您FILE*在两个不同的过程中有两个不同,我认为您别无选择。

于 2010-02-08T09:31:08.893 回答
5

它可以混合。

如果您有多个线程/进程写入同一个文件,则需要使用锁定。

另一种方法是将日志消息发送到专用服务/线程。一个优秀的工具是syslog,它肯定安装在所有的 unix 上并且可以在Windows上运行。

于 2010-02-08T09:20:57.543 回答
2

从 Debian lenny 上的“man flockfile”开始,stdio 函数是线程安全的。

有线程不安全的 stdio 函数,“man unlocked_stdio”了解更多详细信息。

您可以从手册页获取更多信息。

于 2010-11-16T13:38:00.123 回答
-1

fwrite for visual studio 锁定调用线程,因此是线程安全的

于 2013-11-27T13:10:10.623 回答