一个简单的问题:
我需要在我的程序中添加一些日志记录。
如果两个进程在同一个文件上使用“fwrite”但不是同一个文件描述符,则写入的日志消息将是原子的或混合的。有长度限制吗?
它是定义的 ANSI-C 行为还是定义的实现?如果稍后在 MacOSX、Linux 和 Windows MSVC 上是什么?
在做了一些研究之后,我在这个链接中发现了以下内容:
POSIX 标准要求 C stdio FILE* 操作是原子的。符合 POSIX 的 C 库(例如,在 Solaris 和 GNU/Linux 上)有一个内部互斥锁来序列化 FILE*s 上的操作。
看起来调用应该是原子的,但这取决于您的平台。在同一个链接中,还有另一段让您认为程序员应该小心:
因此,对于 3.0,“多线程对 I/O 是否安全”的问题必须用“您的平台的 C 库对 I/O 是否线程安全”来回答?有些是默认的,有些不是;许多提供 C 库的多种实现,并在线程安全性和效率方面进行了不同的权衡。你,程序员,总是需要照顾多个线程。
另外,由于您FILE*
在两个不同的过程中有两个不同,我认为您别无选择。
从 Debian lenny 上的“man flockfile”开始,stdio 函数是线程安全的。
有线程不安全的 stdio 函数,“man unlocked_stdio”了解更多详细信息。
您可以从手册页获取更多信息。
fwrite for visual studio 锁定调用线程,因此是线程安全的