一个简单的问题:fwrite是原子吗?
我需要添加一些日志到我的程序。
如果两个进程在同一个文件上使用“fwrite”而不是相同的文件描述符,则写入的日志消息将是原子的或混合的。是否有长度限制?
是否定义了ANSI-C行为或实现定义? 如果以后在MacOSX,Linux和Windows MSVC上有什么?
一个简单的问题:fwrite是原子吗?
我需要添加一些日志到我的程序。
如果两个进程在同一个文件上使用“fwrite”而不是相同的文件描述符,则写入的日志消息将是原子的或混合的。是否有长度限制?
是否定义了ANSI-C行为或实现定义? 如果以后在MacOSX,Linux和Windows MSVC上有什么?
之后做一些研究我发现在这个link如下:
POSIX标准要求C STDIO FILE *操作都是原子。 符合POSIX的C库(例如,在 Solaris和GNU/Linux上)有一个内部互斥体 ,用于在FILE *上序列化操作 。
它看起来像调用应该是原子,但它取决于您的平台。在相同的链接,还有另一段让你认为程序员应该注意:
因此,对于3.0的问题“是 多线程安全的I/O”必须 回答, “您的平台的C/O库存线程安全是否适用于I/O?”有些是默认的 ,有些不是;许多提供了 库的多种实现方式,并且具有 线程安全性和效率的各种权衡。你, 程序员,总是需要 注意多个线程。
此外,由于您在两个不同的过程中有两个不同的FILE*
,我认为你别无选择。
但每个进程都有自己的FILE? – Will
@威尔:你的权利。更新,谢谢! – yeyeyerman
在Windows上,'fwrite'是原子。[源代码](https://msdn.microsoft.com/en-us/library/h9t88zwz.aspx?f=255&MSPPError=-2147217396):*因为此函数锁定调用线程,所以它是线程安全的。对于非锁定版本,请参阅_fwrite_nolock。* – rustyx
从Debian lenny上的“man flockfile”,stdio函数是线程安全的。
有线程不安全的stdio函数,“man unlocked_stdio”获取更多细节。
您可以从手册页获取更多信息。
FWRITE为Visual Studio锁定调用线程,因此线程安全
从经验来看,高优先级的任务/线程的地方将他们的文字在一个较低的优先级线程的文本。这可以通过从队列输出一个任务并将另一个任务附加到队列来解决。 –