- 论坛徽章:
- 0
|
一个旧项目的日志系统,没有按照常规的思路用一个线程单独写日志,而是使用多个线程同时写一个日志文件,简化如下:- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- #include <unistd.h>
- static FILE* logfile;
- static char* logfilename = "test.log";
- void* thr_func(void* arg);
- int main()
- {
- logfile = fopen(logfilename, "a");
- //setvbuf(logfile,NULL,(int)_IOLBF,0);
- int thread_num = 3;
- pthread_t a[3];
- printf("%ld\n",sizeof(pthread_t));
- for ( int i = 0; i< thread_num ; i++ )
- {
- pthread_create(a+i, NULL, thr_func,NULL)
- }
- sleep(10);
- return 0;
- }
- void* thr_func(void* arg)
- {
- pthread_t tid = pthread_self();
- fprintf(logfile,"threadid = %lu--%s\n",tid,"writing file");
- fprintf(logfile,"threadid = %lu--%s\n",tid,"writing file");
- fprintf(logfile,"threadid = %lu--%s\n",tid,"writing file");
- return (void*)0;
- }
复制代码 测试结果如下:
threadid = 139753191249664--writing file
threadid = 139753191249664--writing file
threadid = 139753191249664--writing file
threadid = 139753182856960--writing file
threadid = 139753182856960--writing file
threadid = 139753182856960--writing file
threadid = 139753174464256--writing file
threadid = 139753174464256--writing file
threadid = 139753174464256--writing file
也就是看起来似乎还可以,日志内容虽然每行发生交叉,但是没有出现行内交叉。
请教如下问题:
1、fprintf需要加锁?实际测试时,若加锁,同时开启多个线程,则CPU占用异常高,应该就是抢占锁造成的,大大影响系统的效率
2、不加锁,那么如何保证一个线程的log不会被另一个线程的log打乱 |
|