免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-29 22:37 |只看该作者 |倒序浏览
今天和同事讨论一个问题,大家对这个问题有点分歧,在这里想听听大家的意见。
情景是假如有多个线程,对同一个socket(tcp)进行写操着,是否需要对这个socket进行加锁.
我的意见是不需要对socket进行加锁的,因为从来没见过这样的做法,而且感觉这些问题操作系统
或者说是tcp/ip协议应该都处理了,这仅仅是感觉.另一种意见说在写的过程中有可能写了一半的
数据到缓存中,发生了切换,另一个线程也可能写了些数据到缓存中,有可能导致接收方收到的不是
一个完整的包(混杂了2个线程写的包).我对这个说法感到怀疑,但是搜不到切实的理论依据,希望
在这方面有研究的高手们或者遇到过这个问题的同志们讲解或者能贴出解释这个问题的链接.
thanks.

[ 本帖最后由 yuangong 于 2007-8-29 22:39 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-08-29 23:01 |只看该作者
对socket不用加锁,但对你要用到写缓冲区需要锁定,因为那个是共享资源。

论坛徽章:
0
3 [报告]
发表于 2007-08-29 23:19 |只看该作者
socket描述符就是一个普通的文件描述符吧,和标准输出的情况应该一样的

论坛徽章:
0
4 [报告]
发表于 2007-08-30 00:23 |只看该作者
多个线程操作一个socket,就算加了锁,数据在内核缓冲区也可能会出现交替。

论坛徽章:
0
5 [报告]
发表于 2007-08-30 09:19 |只看该作者
原帖由 diker007 于 2007-8-30 00:23 发表
多个线程操作一个socket,就算加了锁,数据在内核缓冲区也可能会出现交替。

恩,向描述符输出了就是写到缓冲区,至于何时将缓冲区内容写出,由内核决定,例如,标准输出,采用行缓冲的话,直到遇到\n或缓冲区满或fflush,才会将缓冲区内容写出,

[ 本帖最后由 cugb_cat 于 2007-8-30 09:59 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-08-30 09:23 |只看该作者
那个写缓存为系统资源,如何能对其加锁?
加锁socket是保证每次只有一个线程对其操着,数据在内核缓冲区应该是不会出现交替

论坛徽章:
0
7 [报告]
发表于 2007-08-30 09:31 |只看该作者
和socket还是普通文件没有关系,因为write的参数是fd,而不是socket特定的
多个线程都要写的有几个特点
1.哪个线程先写是不一定的
2.写可能少于要写的字节

很显然,内核不负责,可能出现这种情况
a线程写100个字节,结果返回80,然后到用户态了,最后b线程又写,写成功了若干字节。

论坛徽章:
0
8 [报告]
发表于 2007-08-30 09:42 |只看该作者

我一般为了保险起见,加上锁的。

我一般为了保险起见,加上锁的。

论坛徽章:
0
9 [报告]
发表于 2007-08-30 09:51 |只看该作者
原帖由 flw2 于 2007-8-30 09:31 发表
和socket还是普通文件没有关系,因为write的参数是fd,而不是socket特定的
多个线程都要写的有几个特点
1.哪个线程先写是不一定的
2.写可能少于要写的字节

很显然,内核不负责,可能出现这种情况
a线程写 ...

每个socket都有自己的接收缓存,对socket加锁,也就是说每次write前对其加锁.
这样即使发生切换,缓存也只有一个线程能写.
所以不会发生A写了80字节后切换,B 写了30字节,A又写剩下的20字节.
也就是 说多线程对同一socket进行写,的确需要加锁?

论坛徽章:
0
10 [报告]
发表于 2007-08-30 10:01 |只看该作者
socket write应该是原子的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP