2010-02-08 49 views
10

一个简单的问题:fwrite是原子吗?

我需要添加一些日志到我的程序。

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

是否定义了ANSI-C行为或实现定义? 如果以后在MacOSX,Linux和Windows MSVC上有什么?

+0

从经验来看,高优先级的任务/线程的地方将他们的文字在一个较低的优先级线程的文本。这可以通过从队列输出一个任务并将另一个任务附加到队列来解决。 –

回答

3

它可以混合使用。

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

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

14

之后做一些研究我发现在这个link如下:

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

它看起来像调用应该是原子,但它取决于您的平台。在相同的链接,还有另一段让你认为程序员应该注意:

因此,对于3.0的问题“是 多线程安全的I/O”必须 回答, “您的平台的C/O库存线程安全是否适用于I/O?”有些是默认的 ,有些不是;许多提供了 库的多种实现方式,并且具有 线程安全性和效率的各种权衡。你, 程序员,总是需要 注意多个线程。

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

+0

但每个进程都有自己的FILE? – Will

+0

@威尔:你的权利。更新,谢谢! – yeyeyerman

+1

在Windows上,'fwrite'是原子。[源代码](https://msdn.microsoft.com/en-us/library/h9t88zwz.aspx?f=255&MSPPError=-2147217396):*因为此函数锁定调用线程,所以它是线程安全的。对于非锁定版本,请参阅_fwrite_nolock。* – rustyx

1

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

有线程不安全的stdio函数,“man unlocked_stdio”获取更多细节。

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

-1

FWRITE为Visual Studio锁定调用线程,因此线程安全