免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9902 | 回复: 14
打印 上一主题 下一主题

[Linux] 多线程写入一个文件会不会导致同步问题?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-18 21:49 |只看该作者 |倒序浏览
在linux中,有多个线程的伪代码如下:
  1. pthread_function()
  2. {
  3.         FILE fp;
  4. .......................

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

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-09-18 22:47 |只看该作者
如果你了解FILE的无缓冲, 行缓冲, 全缓冲就没这些疑问了.

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

论坛徽章:
0
3 [报告]
发表于 2012-09-18 23:42 |只看该作者
要是能保证每个线程在确定的文件块内写入,并且用pwrite来代替fseek和fwrite,不用加锁都能保证文件的数据不会混乱吧???

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2012-09-19 11:11 |只看该作者
你用过? offset从那里来?

论坛徽章:
0
5 [报告]
发表于 2012-09-19 20:59 |只看该作者
根据文件的大小,然后划分不同的文件块

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
6 [报告]
发表于 2012-09-19 22:24 |只看该作者
强词夺理, 请问写到多少块从哪里获得?

论坛徽章:
0
7 [报告]
发表于 2012-09-19 23:44 |只看该作者
{:3_191:}不要激动,我的具体实现是先取得远程的文件的大小(假如为600),然后分割成1-200,200-300,300-600这个三个块,然后生成三个线程去请求远程文件不同块的数据,当取得数据后,线程根据划分好的文件块范围,将数据写入本地文件,这样应该没有问题吧

论坛徽章:
0
8 [报告]
发表于 2012-09-20 08:08 |只看该作者
回复 7# 星辉流动


    神奇 --__--

论坛徽章:
125
处女座
日期:2014-06-14 02:20:38双子座
日期:2014-06-14 03:59:12处女座
日期:2014-06-14 04:14:31狮子座
日期:2014-06-14 05:24:38巳蛇
日期:2014-06-14 05:48:58巨蟹座
日期:2014-06-14 05:50:18摩羯座
日期:2014-06-14 06:23:58双鱼座
日期:2014-06-14 06:49:15亥猪
日期:2014-06-14 07:04:56巨蟹座
日期:2014-06-14 07:12:32双子座
日期:2014-06-14 07:26:53射手座
日期:2014-06-14 07:58:51
9 [报告]
发表于 2012-09-20 14:41 |只看该作者
会导致写失败

论坛徽章:
125
处女座
日期:2014-06-14 02:20:38双子座
日期:2014-06-14 03:59:12处女座
日期:2014-06-14 04:14:31狮子座
日期:2014-06-14 05:24:38巳蛇
日期:2014-06-14 05:48:58巨蟹座
日期:2014-06-14 05:50:18摩羯座
日期:2014-06-14 06:23:58双鱼座
日期:2014-06-14 06:49:15亥猪
日期:2014-06-14 07:04:56巨蟹座
日期:2014-06-14 07:12:32双子座
日期:2014-06-14 07:26:53射手座
日期:2014-06-14 07:58:51
10 [报告]
发表于 2012-09-20 14:41 |只看该作者
虽然概率很小     
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP