gpt4 book ai didi

c - 以下使用 FILE*、ftell、fwrite 和 fflush 的代码是否线程安全?

转载 作者:太空宇宙 更新时间:2023-11-03 23:32:55 24 4
gpt4 key购买 nike

在下面的代码中,我的函数将一个数据条目写入磁盘,并且应该将偏移量返回到记录该条目的文件中。但是,在多线程中运行代码时,我偶尔会发现这个值不准确。这段代码有没有线程安全问题?

// global file descriptor to current data file, shared amongst many threads
FILE* current_fp;
pthread_mutex_t my_mutex;
...

int main()
{
...
pthread_mutex_lock(&my_mutex);

current_fp = fopen(data_file, "ab");
if (current_fp == NULL)
{
fprintf(stderr, "%s: Unable to open file %s: %s\n", __func__, data_file, strerror_r(errno, ebuf, sizeof(ebuf)));
pthread_mutex_unlock(&ldb_mutex);
return -1;
}

pthread_mutex_unlock(&my_mutex);

return 0;
}

// write a data entry, and return the offset at which it will be stored
// I'm having an issue where it seems like *occasionally* the offset returned is not
// really the offset at which the entry was stored, with multiple threads
long write_log_entry(data_entry_t* entry)
{
int num_written;
long offset; // offset at which entry will be written

pthread_mutex_lock(&my_mutex);

// get the next offset in the file, which is where I expect
// the entry to be stored
offset = ftell(current_fp);
if (offset == -1)
{
error();
}

// an example -- the real code writes a bunch of data members of entry
int num_written = fwrite(entry, sizeof(data_entry_t), 1, current_fp);
if (num_written != 1)
{
error();
}

fflush(current_fp);

pthread_mutex_unlock(&my_mutex);

return offset;
}

最佳答案

可能问题与fopen手册中描述的行为有关:

'请注意,ANSI C 要求在输出之间插入一个文件定位函数 和输入,除非输入操作遇到文件结束。 (如果不满足此条件,则允许读取返回其他写入的结果 比最近的。)因此这是很好的做法(实际上有时 在 Linux 下是必需的)以在两者之间放置一个 fseek(3) 或 fgetpos(3) 操作 对这样的流进行写和读操作。这个操作可能是一个明显的 无操作(如在 fseek(..., 0L, SEEK_CUR) 中调用其同步端 效果。”

ftell 可能被视为读取操作。尝试在 ftell 之前插入 fseek(..., 0L, SEEK_CUR) 看看是否有帮助。

关于c - 以下使用 FILE*、ftell、fwrite 和 fflush 的代码是否线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11298889/

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