免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
31 [报告]
发表于 2010-10-20 00:00 |只看该作者
恩,看来终于讲到一起去了,

send()会是怎样呢? 感觉更加复杂,因为关系到tcp的一 ...
chenzhanyiczy 发表于 2010-10-19 23:19



    看了一下源码,send()好像是不会出现write()一样的情况,即它不会出现交叉出错的情况

论坛徽章:
0
32 [报告]
发表于 2010-10-20 08:43 |只看该作者
回复 31# chenzhanyiczy

看代码不容易看出来。
send和write一样,write socket几下子就调用send(之类)了。
也是要交错的。
所以,send不能多了进程(线程)同时写一个socket,否则接收端全是乱套的。

我为这个专门给LINUX做了个补丁,使得send(write socket)在一定大小(用户可调)的块的时候也确保是原子的。
实验了,是好用的。

论坛徽章:
0
33 [报告]
发表于 2010-10-20 08:45 |只看该作者
这个问题原来有过讨论,这个给射个精,以后容易查到。

论坛徽章:
0
34 [报告]
发表于 2010-10-20 09:14 |只看该作者
这个问题原来有过讨论,这个给射个精,以后容易查到。
思一克 发表于 2010-10-20 08:45



    我还记得当年曾经讨论过,也是你主导讨论的。呵呵。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
35 [报告]
发表于 2010-10-20 09:29 |只看该作者
回复  chenzhanyiczy

看代码不容易看出来。
send和write一样,write socket几下子就调用send(之类)了 ...
思一克 发表于 2010-10-20 08:43



还是看源代码吧,请看:

778 int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
779                 size_t size)
780 {
781         struct iovec *iov;
782         struct tcp_opt *tp = tcp_sk(sk);
783         struct sk_buff *skb;
784         int iovlen, flags;
785         int mss_now;
786         int err, copied;
787         long timeo;
788
789         lock_sock(sk);790         
             TCP_CHECK_TIMER(sk);
。。。省略很多
971 out:
972         if (copied)
973                 tcp_push(sk, tp, flags, mss_now, tp->nonagle);
974         TCP_CHECK_TIMER(sk);
975         release_sock(sk);976        
        return copied;

粗体部分!
可以看到这个加了锁。它的意思是锁住整个套接口。我不明白为什么会出现交叉出错?

论坛徽章:
0
36 [报告]
发表于 2010-10-20 09:30 |只看该作者
回复 34# assiss


不是我主导的,是别人提出的。
我一般也是临时研究才有一些结论的。
实际上我是用论坛学习的。没那些问题,我就不会动脑子。

论坛徽章:
0
37 [报告]
发表于 2010-10-20 09:31 |只看该作者
mark,c版这段很少有讨论这么热烈的贴了

论坛徽章:
0
38 [报告]
发表于 2010-10-20 09:35 |只看该作者
粗体部分!
可以看到这个加了锁。它的意思是锁住整个套接口。我不明白为什么会出现交叉出错?
------------
锁住的意思不是防止交叉。
在加锁和解锁之间会有休眠的。然后锁让给了别人。当然会交叉了。
还有,设计者不认为交叉是“出错”。而认为是正常的。是用户使用不当。
我给LINUX内核补丁维护的写过信,那些权威人就如此坚持说(我不完全同意)。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
39 [报告]
发表于 2010-10-20 09:41 |只看该作者
粗体部分!
可以看到这个加了锁。它的意思是锁住整个套接口。我不明白为什么会出现交叉出错?
---------- ...
思一克 发表于 2010-10-20 09:35



    如果不是为了防止交叉,那这锁有什么用吗?

论坛徽章:
0
40 [报告]
发表于 2010-10-20 09:47 |只看该作者
如果不是为了防止交叉,那这锁有什么用吗?
----------
防止2个进程/线程同时写。
交叉不是“同时写”引起的。
比如2进程AB个竞争同一个SOCKET,有这个锁,假设A先用了,B就等待了。B不会写。
但A不能用的太过分(发送太大的块)。
在A发送大块的时候,A会休眠(让给其他人)。然后B得到锁,B再发送自己的数据。
结果就交叉了。

有点像“分时合理分配“的意思。
就是不能让一个人无理独占过长的时间,让其他人等待。要保证公平。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP