是在线程安全的不同字节范围读取和写入同一文件?

时间:2014-03-13 01:14:44

标签: c multithreading file concurrency posix

我有一个名为“data.txt”的文件,总是有50个字节的数据。

我有两个主题。

第一个线程,从字节0到字节50读取内容:

while(1){
    char buf[50];
    FILE* fp = fopen("data.txt","r");
    fread(buf,1,50,fp);
    /* process data */
    fclose(fp);
}

第二个线程,将数据附加到文件中(=始终在前50个字节之后):

while(1){
    FILE* fp = fopen("data.txt","a");
    fwrite("hello\n",1,6,fp);
    fclose(fp);
}

此解决方案是否是线程安全且可移植的? (没有分段错误,没有数据不一致,......)

2 个答案:

答案 0 :(得分:1)

正如我在你的另一篇相关文章中所写,据我所知,它不应该崩溃。无论是写入,还是读取和读取,我都不知道。

如果您使用的是POSIX系统:您是否考虑过使用fifo(参见http://man7.org/linux/man-pages/man7/fifo.7.html)?我的印象是文件系统只是您的底层通信需求的帮助,即实际文件并不重要。

答案 1 :(得分:0)

只有一个位置指示器与文件流相关联,问题是如果以追加模式打开文件,位置指示器会在每次写入之前转到文件末尾。您可以使用fseek()重新定位位置指示器以进行读取,但只要您写入文件,位置指示器就会返回到文件末尾。

修改
没关系,因为每个线程中的每个文件描述符将彼此独立。