免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3900 | 回复: 7
打印 上一主题 下一主题

多个线程写日志是否需要互斥操作? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-27 17:50 |只看该作者 |倒序浏览
我在Linux下想用两个线程同时对一个日志文件进行写操作;
在程序中打开/关闭文件,多个线程写并且无互斥操作;
是否需要对进行互斥操作;
我看见网上有些程序写日志并没有对写文件进行互斥操作;
老是觉的不踏实,但用下面的写法运行确实没有发现断行现象

我刚在linux写程序,请各位老师给个指导,
你们都是如何写日志呢,怎样才能不占用太多的时间?

大致情况如下
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

FILE *g_pf = NULL;

void * thr_fn (void *arg)
{
    int i;
    for (i=0; i<10000; ++i)
        fprintf (g_pf, "thread %u is writing.\n", pthread_self());//这里会不会被中断?
   
    return NULL;
}

int main ()
{
    pthread_t tid1, tid2;
   
    g_pf = fopen ("./log.file", "w" );
    setvbuf (g_pf, NULL, _IONBF, 0);// 是不是设置空缓存就可以不用设置互斥操作了?

    pthread_create (&tid1, NULL, thr_fn, NULL);
    pthread_create (&tid2, NULL, thr_fn, NULL);
    printf ("thread->%u\nthread-->%u\n", tid1, tid2);

    // 写出来的log.file文件并没有发现断行的现象,
    // 是不是这样写真的没问题
    getchar ();
    fclose (g_pf);
   
    return 0;
}

论坛徽章:
0
2 [报告]
发表于 2007-07-27 20:24 |只看该作者
没有缓存肯定不会出问题,因为他们的fd都是同一个。

有缓存的话当然会啦,你的fprintf可以认为就是往一个缓存中写数据,这个时候是没有加锁的。

论坛徽章:
0
3 [报告]
发表于 2007-07-27 22:53 |只看该作者

文件锁

恩,文件锁........

论坛徽章:
0
4 [报告]
发表于 2007-07-27 23:30 |只看该作者
我象你如果用syslogd的服务,就不要考虑concurrency了

论坛徽章:
0
5 [报告]
发表于 2007-07-28 17:50 |只看该作者

回复 3位

谢谢各位的大虾:)

to flw2:
是不是可以这样理解:
就是说没有设置缓存时就不会造成写文件错误了,
多个fprintf发生时就一个一个排队来写,
要是这样的话我就可以安心使用这种写法了

to newcore:
文件锁,是不是对文件加互斥锁?
需要写的时候再解锁,
这样写文件我觉的虽然安全但是有点慢,繁琐
呵呵,我有点懒了

to tom_xx_hu:
我查了一下,
syslogd服务好像把日志文件都写在一个系统文件了,
不知道能不能指定一个专门的文件,
还有日志有自定义的信息格式?
这些都该怎么定义呢

总之,谢谢大家

论坛徽章:
0
6 [报告]
发表于 2007-07-28 18:10 |只看该作者
to xiongyu

我想了想,还是觉得fprintf有问题,等我研究一下

我今天看了一个实现,里面有锁(FILE结构)所以这种实现是安全的,不知道标准是怎么规定的

如果没有锁,即使没有缓存,fprintf还是要把格式串转化为最终的打印字符串 ,所以也需要空间。不考虑太长的串(比如1M),那么应该也是安全的(缓存来自malloc?我的猜测,因为空间一知道有多大)

论坛徽章:
0
7 [报告]
发表于 2007-07-29 10:42 |只看该作者
原帖由 xiongyu 于 2007-7-28 17:50 发表
www.science.uoit.ca.conf

syslog可以指定日志文件,不过它不让程序员直接指定,而是让你指定日志的priority,每种priority的日志syslog都有一个去处,或某文件或邮件地址或系统控制台或用户登录出口,由系统管理员配置。如果你的日志是只和应用相关的,你可以使用自定义的priority LOG_LOCAL0 至7属于用户定义priority,这时你要协调SA在syslog配置中加设相应的内容,主要是告诉syslogd,这种用户定义的priority的日志记录应当往哪里放。
详情请查阅syslog(3)manpage。

论坛徽章:
0
8 [报告]
发表于 2007-07-29 19:46 |只看该作者

回复 2位

to chmxu:
加锁肯定是安全的,
你有写好的例子一定要告诉我哦,
呵呵,先谢谢了

to tom_xx_hu:
用syslog的话就要和管理员联系了,
我只是一个简单的应用,
把日志生成在当前目录下,
不过学到不少东东,谢谢啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP