gpt4 book ai didi

c - 这个文件操作线程安全吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:05 24 4
gpt4 key购买 nike

我想知道我的 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;
}

最佳答案

您的代码不是线程安全的。如果其中一个线程试图打开文件而另一个线程已打开文件,则第二次打开尝试可能会因共享冲突而失败。即使操作系统允许您同时打开文件两次,您现在也有两个独立的非同步缓冲区和两个不同的文件指针。绝对不能保证您的写入是一致的。

您应该使用互斥量序列化对共享资源的访问。

或者,使用生产者/消费者方法并将所有写入日志的操作放在单个线程(消费者)上。然后让多个生产者线程将日志任务推送到消费者线程上。

关于c - 这个文件操作线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14845014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com