免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: rain_fish
打印 上一主题 下一主题

关于多线程对同一个文件进行写操作,记得坛子里面讨论过,不需要互斥,原因什么来着? [复制链接]

论坛徽章:
0
61 [报告]
发表于 2010-10-21 12:39 |只看该作者
本帖最后由 epegasus 于 2010-10-21 13:13 编辑

回复 60# 思一克


    各执行一次也可能将aaaaaaaaaaabbbbbbbbbbbbb搞成aaaaaabbaaaaaaabbbbbbbbb样子。
只要数据块足够长就可能发生。
---------------------------------------------
不可能发生. 这里指类似ext2 这样的磁盘文件系统.
原因上面已经说了. 标准不允许(大概), 且实现确实不允许.

论坛徽章:
0
62 [报告]
发表于 2010-10-21 13:15 |只看该作者
回复 60# 思一克


    各执行一次也可能将aaaaaaaaaaabbbbbbbbbbbbb搞成aaaaaabbaaaaaaabbbbbbbbb样子。
只要数据块足够长就可能发生。
---------------------------------------------
不可能发生. 这里指类似ext2 这样的磁盘文件系统.
原因上面已经说了. 标准不允许(大概), 且实现确实不允许.
----------------------------------------------
没有太明白你的意思。
你说能交错成啥样?

论坛徽章:
0
63 [报告]
发表于 2010-10-21 13:16 |只看该作者
如果按以上描述,一个write真正的写部分是不能被另一个打断的。
比如一个写aaaa 一个写bbbb结果可能是aabbbb 但不可能是abab。
而追加方式下一定是aaaabbbb)(假设2个都是O_APPEND方式打开)
---------------
我就是这里没有看明白意思

论坛徽章:
0
64 [报告]
发表于 2010-10-21 13:26 |只看该作者
本帖最后由 epegasus 于 2010-10-21 13:29 编辑

回复 63# 思一克


    2进程每个只write一次
一个write aaaa
一个write bbbb

write aaaa 在释放inode相关锁前,write bbbb不能写如任何东西
所以出现aabbbb 仅仅是第一个写完了, 第2个因为偏移原因产生的一次覆盖(追加方式下不可能发生).注意这个覆盖最多仅发生一次
而绝不会出现abab的情况.
因为这个情况发生在第一个write了aa后被切换或者在多处理器上由另一个并行写b.
然后再切换回来或者再被这个处理器写a.
注意如果这样发生的就是当一个写没处理完 另一个写就发生. 而这是不允许的.

论坛徽章:
0
65 [报告]
发表于 2010-10-21 13:44 |只看该作者
2进程每个只write一次
一个write aaaa
一个write bbbb
write aaaa 在释放inode相关锁前,write bbbb不能写如任何东西
所以出现aabbbb 仅仅是第一个写完了, 第2个因为偏移原因产生的一次覆盖(追加方式下不可能发生).注意这个覆盖最多仅发生一次
而绝不会出现abab的情况.
因为这个情况发生在第一个write了aa后被切换或者在多处理器上由另一个并行写b.
然后再切换回来或者再被这个处理器写a.
注意如果这样发生的就是当一个写没处理完 另一个写就发生. 而这是不允许的.
-----------------------
明白了。
你的意思是,覆盖是因为seek的原因(?)
如果这样,那么多个进程不断写同一个文件的同一位置(比如0---1024)能如何交错法?

论坛徽章:
0
66 [报告]
发表于 2010-10-21 13:53 |只看该作者
2进程每个只write一次
一个write aaaa
一个write bbbb

write aaaa 在释放inode相关锁前,write bbbb不能写如任何东西
所以出现aabbbb 仅仅是第一个写完了, 第2个因为偏移原因产生的一次覆盖(追加方式下不可能发生).注意这个覆盖最多仅发生一次
-----------------------------------
如果按你这样分析,多个进程写同一个pipefd, 数据会交叉吗?
如何交叉?

论坛徽章:
0
67 [报告]
发表于 2010-10-21 16:44 |只看该作者
回复 2# epegasus
请问大侠 apue中的例程你敲过吗?我现在在官网上下的包apue.linux.tar.gz怎么装不上呢?想安装它的头文件,才能运行书中的例子,但是我一直没能装上去,很头疼。。。

论坛徽章:
0
68 [报告]
发表于 2010-10-21 17:01 |只看该作者
回复 65# 思一克


    如果这样,那么多个进程不断写同一个文件的同一位置(比如0---1024)能如何交错法?
---------------------------------

应该不会有任何交错.一切符合上面说的.包括跨页块的写
说"应该"是因为我只能确定ext2,对于ext3我还有不确定的地方.即写本身到磁盘分成好几步.它的写是通过一种异步实现的,所以没搞清楚

测试是否交错有一种方法:
一个重复的写2个字符AB
另一个重复写CD
2个都是从0偏移开始
不管用不用追加方式.都不应该看到单独的被拆分的A 或 B或C或D出现.
不过这个条件建立在一个write要么写2个字符成功.要么一个都写不进
如果出现单独的说明 写如一个就终止的,这种情况APUE没有明说 linux系统编程(by robert love)倒是说了可能存在.




如果按你这样分析,多个进程写同一个pipefd, 数据会交叉吗?
如何交叉?
---------------------------------------------------------------------------
pipe和普通磁盘文件系统是一样 也通过mutex_lock(&inode->i_mutex)保护
所以结论和上面的ext2一样 但是对于pipe或许出现写入字节数小于传入字节数的可能性更大.----要确定这个要看pipe是如何定义和实现的.我不能确定.
而pipe写还可能已经类似普通文件一样默认就是O_APPEND方式,所以我认为写它真的不需要加锁.

论坛徽章:
0
69 [报告]
发表于 2010-10-21 17:02 |只看该作者
回复 67# sumland


    没完过.我没有UNIX-LINUX环境

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
70 [报告]
发表于 2010-10-21 17:27 |只看该作者
回复  思一克


    如果这样,那么多个进程不断写同一个文件的同一位置(比如0---1024)能如何交错法? ...
epegasus 发表于 2010-10-21 17:01



    "应该不会有任何交错.一切符合上面说的.包括跨页块的写"
请问,有代码证据吗?

比如:
线程a write 5个字节(11111)
线程b write 1个字节(2)

如果两次write成功的话,那么你觉得应该不会出现:12111 或者 11211 等等,而可能出现11112,21111的情况?
如果是的话,那么请看下面源码:
asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)
{
     struct file *file;
     ssize_t ret = -EBADF;
     int fput_needed;
      file = fget_light(fd, &fput_needed);
     if (file) {
         loff_t pos = file_pos_read(file);               
         ret = vfs_read(file, buf, count, &pos);      --------> b阻塞在这,a也阻塞在这,但a是执行的,b是等待a执行完再执行的
         file_pos_write(file, pos);                  ----->假设a执行到,现在才更新pos,而b现在开始执行在vfs_read(),pos是原来的pos
         fput_light(file, fput_needed);
     }

     return ret;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP