免费注册 查看新帖 |

Chinaunix

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

请教:多线程同时写socket是否需要加锁 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2007-08-30 19:14 |只看该作者
支持

原帖由 思一克 于 2007-8-30 15:55 发表
socket写时基本上没有加锁的需求。多个不同的程序同时写一个socket,一般没有这样做的

论坛徽章:
0
42 [报告]
发表于 2007-08-31 09:31 |只看该作者
一般都是多个工作线程把需要发送的数据写到一个加锁的缓冲区中,然后另外一个线程单独进行收发。多个线程直接写socket还真没这么做过。我觉得应该是加锁处理,并且需要判断已发送字节数等于发送字节数才成。

论坛徽章:
0
43 [报告]
发表于 2007-08-31 15:27 |只看该作者
原帖由 flw2 于 2007-8-30 15:32 发表


呵呵,我觉得代码可以证明需要做什么。而不能证明不需要做什么。

就好比一个bug 100万年才可能发生一次,我们不能跑1年甚至1万年就说程序没有bug


一个字回答大侠,牛

论坛徽章:
0
44 [报告]
发表于 2007-09-01 19:52 |只看该作者
需要加锁。 除非单一线程发送

论坛徽章:
0
45 [报告]
发表于 2007-09-11 20:46 |只看该作者
把这个贴子再顶起来,因为我今天刚好碰到了这个问题。用多个线程写一个套接口,读据在应用层肯定是混在一起的,比如线程t1要写100个'a',线程t2要写100个'b',那么实际上对方接收到的数据是a、b混杂的,这就一点意义也没有了。有人说write是原子的,但是我们一般用的都是writen吧,很少调用一次write不管结果如何都返回的。可以结贴了吧,呵呵

[ 本帖最后由 Jass 于 2007-9-11 21:16 编辑 ]

论坛徽章:
0
46 [报告]
发表于 2007-09-12 10:15 |只看该作者
对SOCKET的写操作从用户的角度并不是原子的,因为如果一次发送1M数据,肯定不是原子的.至于一次发送多少会是原子的,好像没有明确的说法 (最好不要去做原子性的假设) (和MTU是没有关系的,那是底层的分包)

论坛徽章:
0
47 [报告]
发表于 2007-09-21 11:00 |只看该作者
归根结底好像有两个结论:

1.避免多个线程同时对一个socket进行操作。

2.如果是在无法避免上述情况,则应该加锁。

是否正确?

论坛徽章:
0
48 [报告]
发表于 2007-10-08 17:05 |只看该作者
其实多个线程同时对一个socket进行写操作没有什么意义,因为接收方收到的数据是混杂的,无意义的,如果确实要这样做,那么想办法想出另一个机制会更好点!这个机制是怎样确保接收方收到的数据是有意义的!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
49 [报告]
发表于 2007-10-08 17:11 |只看该作者
要加锁。

论坛徽章:
0
50 [报告]
发表于 2007-10-08 23:27 |只看该作者
你为什么要让多个线程并发写同一个流式socket???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP