当前位置:  开发笔记 > 编程语言 > 正文

glibc是否实现了fprintf()线程安全?

如何解决《glibc是否实现了fprintf()线程安全?》经验,为你挑选了2个好方法。

fprintf是线程安全的吗? glibc手册似乎说它是,但我的应用程序,使用单个调用fprintf()写入文件似乎是混合来自不同进程的部分写入.

编辑:为了澄清,有问题的程序是一个lighttpd插件,服务器正在运行多个工作线程.

查看该文件,一些写入混合在一起.

编辑2:我看到的问题似乎可能是由于lighttpd的"工作线程"实际上是单独的进程: http://redmine.lighttpd.net/wiki/lighttpd/Docs:MultiProcessor

问题

通过在同一个套接字上运行2个或更多进程,您将获得更好的并发性,但是您必须注意一些缺点:

mod_accesslog可能会创建损坏的访问日志,因为同一个文件打开两次并且未同步.

mod_status将有n个独立的计数器,每个进程一个.

mod_rrdtool将失败,因为它收到两次相同的时间戳.

mod_uploadprogress将不会显示正确的状态.

PaulJWilliam.. 14

你混淆了两个概念 - 从多个线程编写和从多个进程编写.

在一个进程内部,可以确保在下一个调用之前完成一次fprintf调用,然后允许访问输出缓冲区,但是一旦你的应用程序将该输出泵送到一个文件,你就会受到操作系统的支配.如果没有某种基于操作系统的锁定机制,您无法确保完全不同的应用程序不会写入您的日志文件.



1> PaulJWilliam..:

你混淆了两个概念 - 从多个线程编写和从多个进程编写.

在一个进程内部,可以确保在下一个调用之前完成一次fprintf调用,然后允许访问输出缓冲区,但是一旦你的应用程序将该输出泵送到一个文件,你就会受到操作系统的支配.如果没有某种基于操作系统的锁定机制,您无法确保完全不同的应用程序不会写入您的日志文件.



2> dsm..:

听起来像你需要阅读文件锁定.您遇到的问题是多个进程(即非线程)同时写入同一文件,并且没有可靠的方法来确保写入是原子的.这可能导致文件覆盖彼此的写入,混合输出和完全不确定的行为.

这与Thread Safety无关,因为这仅适用于单进程多线程程序.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有