免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wflyfox
打印 上一主题 下一主题

[C] 请教linux c多线程系统日志系统的实现 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-08-25 16:01 |只看该作者

回复 #6 思一克 的帖子

同写一个文件不加锁会出问题吧?

论坛徽章:
0
12 [报告]
发表于 2009-08-25 16:01 |只看该作者
原帖由 wflyfox 于 2009-8-25 15:48 发表
写日志的地方比较多,竞争的机会应该蛮大的


弄个thread单独写,semaphore控制生产者消费者,
或者用两个 condition 更加方便。
log_buf开大点就可以。
这样IO的时间几乎不会有影响了

伪代码:
线程:
pthread_mutex_lock(&l);
while(1)
{
       if ( !log_buf.empty() )
       {
             log_buf.write_to_file();
             pthread_cond_signal(&full);
       }
       else
            pthread_cond_wait(&empty, &l);
}
pthread_mutex_unlock(&l);

其他thread打印log的函数
void log_printf( const char *buf, ... )
{
      ...
      pthread_mutex_lock(&l);
      while( !log_buf.has_enough_buffer() )
             pthread_cond_wait(&full, &l);
      log_buf.printf( buf, va_args );
      pthread_mutex_unlock(&l);

      pthread_cond_signal(&empty);
}

论坛徽章:
0
13 [报告]
发表于 2009-08-25 16:17 |只看该作者
原帖由 gawk 于 2009-8-25 14:51 发表

我是这样用的
搞了个日志缓冲循环表
循环写,只要保证每次调用写日志函数时,缓冲表的索引不重复,就没问题了
这样日志也不会丢,用的挺爽的


我用了多少年也没有问题。
原理上APPEND方式的文件写是原子操作。根本不会有交叉混乱发生。

论坛徽章:
0
14 [报告]
发表于 2009-08-25 16:19 |只看该作者
原帖由 20040925 于 2009-8-25 16:01 发表
同写一个文件不加锁会出问题吧?


不会的。

论坛徽章:
0
15 [报告]
发表于 2009-08-25 16:24 |只看该作者
原帖由 20040925 于 2009-8-25 16:01 发表
同写一个文件不加锁会出问题吧?

同写一个文件 多次打开不同描述符应该是没问题的 前提是APPEND+write这两个条件,这个在很早前讨论write的原子性是有帖子可以看下。想问下思一克,如果是同一个描述符用write不加锁的情况。这两天看apache的代码看到它在write的时候,多线程write同一个文件句柄也是不枷锁的。我现在的理解是,只要不用带缓冲的函数,APPEND方式打开文件,对同一个句柄write也是没问题的。请教下。

论坛徽章:
0
16 [报告]
发表于 2009-08-25 16:38 |只看该作者
原帖由 zhoubug 于 2009-8-25 16:24 发表

同写一个文件 多次打开不同描述符应该是没问题的 前提是APPEND+write这两个条件,这个在很早前讨论write的原子性是有帖子可以看下。想问下思一克,如果是同一个描述符用write不加锁的情况。这两天看apache的代 ...


我的做法就是有LOG要写了就APPEND打开,写LOG后就关闭。

论坛徽章:
0
17 [报告]
发表于 2009-08-25 16:39 |只看该作者
点错了~~给了某人一蛋蛋

论坛徽章:
0
18 [报告]
发表于 2009-08-25 16:46 |只看该作者
原帖由 zhoubug 于 2009-8-25 16:24 发表

同写一个文件 多次打开不同描述符应该是没问题的 前提是APPEND+write这两个条件,这个在很早前讨论write的原子性是有帖子可以看下。想问下思一克,如果是同一个描述符用write不加锁的情况。这两天看apache的代 ...


这个我不是很清楚。可以写个程序实验看。
估计是。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
19 [报告]
发表于 2009-08-25 16:47 |只看该作者
原帖由 wflyfox 于 2009-8-25 15:48 发表
写日志的地方比较多,竞争的机会应该蛮大的


那你就该考虑精简单日志了,因为文件IO是很耗资源的

论坛徽章:
0
20 [报告]
发表于 2009-08-25 17:02 |只看该作者
原帖由 思一克 于 2009-8-25 16:38 发表


我的做法就是有LOG要写了就APPEND打开,写LOG后就关闭。

我有个程序确实是文件记录数据很频繁,所以不想这么做,程序是多进程,每个工作进程又有很多工作线程,
现在只是为每个进程打开文件,在定时器到了rotate log的时候才这么做,程序做过比较大的压力测试确实没发现写交错的情况,
但心里没底,所以想有点理论支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP