星辉流动 发表于 2012-09-18 21:49

多线程写入一个文件会不会导致同步问题??

在linux中,有多个线程的伪代码如下:pthread_function()
{
      FILE fp;
.......................

      if( ( fp = fopen("filename")) !=-1)
      {
               whlie(buf is no empty)
            {
                     fseek(fp,offset+sum,SEEK_SET);
                     fwrite(buf,sizeof(char),count,fp);
                     fflush(fp);
            }
          }
          fclose(fd);
...........................
}其中fp打开的是同一个文件,buf是数据缓冲区。在多线程环境下,在fseek()和fwrite()的一个时间窗口会不会导致文件指针的位置混乱呢?但是在试验中却可以正确写入文件,要是这样,会不会是因为在线程中有个独立的栈,而文件描述符fp的信息记录在栈中,当系统调度线程时,负责维护好栈内线程的信息,从而使文件的指针不会因为多线程并行而出现混乱呢??
      
      

linux_c_py_php 发表于 2012-09-18 22:47

如果你了解FILE的无缓冲, 行缓冲, 全缓冲就没这些疑问了.

安全做法:加锁
实际做法:setvbuf设置无缓冲, 使用"a"打开, O_APPEND保证原子写.

星辉流动 发表于 2012-09-18 23:42

要是能保证每个线程在确定的文件块内写入,并且用pwrite来代替fseek和fwrite,不用加锁都能保证文件的数据不会混乱吧???

linux_c_py_php 发表于 2012-09-19 11:11

你用过? offset从那里来?

星辉流动 发表于 2012-09-19 20:59

根据文件的大小,然后划分不同的文件块

linux_c_py_php 发表于 2012-09-19 22:24

强词夺理, 请问写到多少块从哪里获得?

星辉流动 发表于 2012-09-19 23:44

{:3_191:}不要激动,我的具体实现是先取得远程的文件的大小(假如为600),然后分割成1-200,200-300,300-600这个三个块,然后生成三个线程去请求远程文件不同块的数据,当取得数据后,线程根据划分好的文件块范围,将数据写入本地文件,这样应该没有问题吧

_Rayx 发表于 2012-09-20 08:08

回复 7# 星辉流动


    神奇 --__--

device_memory 发表于 2012-09-20 14:41

会导致写失败

device_memory 发表于 2012-09-20 14:41

虽然概率很小   
页: [1] 2
查看完整版本: 多线程写入一个文件会不会导致同步问题??