我想知道我的 PRINT 宏的线程安全性,并编写了一个程序来查看我这种情况下的文件操作是否是线程安全的,所以我在 fn0 中添加了 sleep 并发现是线程安全的。
$cat t
fn1
fn0
打印两者并且不覆盖。
测试是否足够好或是否存在其他情况 PS:我不共享文件指针我对排序感到满意(无序/非排序很好)我只对损坏/覆盖感兴趣 - 似乎文件指针移动得很好。
------------宏-------------
#define PRINT(args ...) if (logflag) { \
FILE *flog = fopen(LOGFILE, "a"); \
fprintf( flog, args); \
fclose(flog); \
} fprintf(stderr, args); fflush(stderr);
--------------------测试程序----------------------------
#include <stdio.h>
#include <pthread.h>
#define LOGFILE "t"
char c='1';
void *fn0(void* v)
{
FILE *flog = fopen(LOGFILE, "a");
//sleep(2);
fprintf( flog,"%s\n", "fn0");
fclose(flog);
printf ("Enter value ");
c=getchar();
}
void* fn1(void*v)
{
FILE *flog = fopen(LOGFILE, "a");
fprintf( flog,"%s\n", "fn1");
fclose(flog);
}
int main()
{
pthread_t t0;
pthread_t t1;
pthread_create(&t0, NULL, fn0, (void *) NULL);
pthread_create(&t1, NULL, fn1, (void *) NULL);
pthread_join(t1, NULL);
pthread_join(t0, NULL);
return 0;
}