读取和写入相同的文件线程安全吗?

use*_*796 6 c multithreading posix

我有一个名为"data.txt"的文件.

我有两个主题.

第一个线程,读取文件的全部内容:

while(1){
    char buf[1000];
    FILE* fp = fopen("data.txt","r");
    while(fread(buf,1,1000,fp)>0){
        /* process data */
    }
    fclose(fp);
}
Run Code Online (Sandbox Code Playgroud)

第二个线程将数据附加到文件:

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

在这种情况下读取和写入(WHITOUT MUTEX或FILELOCKING)是线程安全吗?(没有分段错误等...)

Pet*_*ica 5

首先,大多数标准库函数,其中除了明确解锁的I/O函数之外,都是正式的线程安全的.请参见http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_09.html.http://pubs.opengroup.org/onlinepubs/009695299/functions/flockfile.html明确指出除特殊要求外不需要flockfile().

关于解锁函数的说法非常有趣,这些函数不是线程安全的.

当且仅当在调用线程拥有(FILE*)对象时调用它们时,这些函数可以安全地用在多线程程序中,就像成功调用flockfile()或ftrylockfile()函数之后的情况一样.

这意味着正常,线程安全保证锁定功能比你在做什么强:他们使用,即使是安全的相同FILE指针(的结果一个 fopen()).很容易看出FILE结构中簿记信息的并发更新如何破坏它; 正常的标准库函数保证不会.

另一方面,C标准说:"同一个文件是否可以同时打开多次也是实现定义的." 有CERT顾问可以避免这种情况.这是您使用多个FILE结构的用例,通过两次fopen()调用获得,可能没有干预fclose(),到同一个底层物理文件.

标准使得定义此实现可能反映某些操作系统的(潜在)限制.

侧面评论:成功尝试并发算法几次并不能保证它是正确的.并发问题是令人毛骨悚然的野兽,它们以不可预测的方式抬头.