免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
51 [报告]
发表于 2007-10-09 00:05 |只看该作者
TCP难说哦,TCP的发送,比方用write,可是每一次不一定会write出你需要的字节数,那么就需要对write做一个封装,我一般取名writen。也就是TCP发一个“包”出去,可能要write好几次的,好几次陷入system call,于是恶性竞争就来了

论坛徽章:
0
52 [报告]
发表于 2007-10-09 00:34 |只看该作者
多个thead写这种事情, 几乎想不到什么地方的应用能用的到。

即使真的有这样的需求, 自己实现个简单的小FIFO, 把LOCK部分作在应用层, 用一个socket thread来write 不就可以了吗。

论坛徽章:
0
53 [报告]
发表于 2007-10-09 09:10 |只看该作者
加锁吧
但是,我想问的是,多个线程往一个socket里写的,也就意味着写无序,那么另外一端的读操作岂不是很郁闷

论坛徽章:
0
54 [报告]
发表于 2007-10-09 09:11 |只看该作者
做过一个项目,需要多个线程用同一个SOCKET,记得当时是加锁了的,因为通信是同步的,不加锁的话,没办法做同步。

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
55 [报告]
发表于 2007-10-09 10:20 |只看该作者
如果需要多个线程同时读访问或写访问同一个tcp socket, 那多半是程序设计上出了问题。

对于tcp的传输,都是要用应用层的协议保证接收方能解释对方发送过来的数据,这样,至少要保证一块数据是一个完整的协议包。

如果是多个线程同时写socket,那么在临界区里工作的线程为了保证数据包的完整发送,必须循环发送等待,直到数据都发送到系统缓冲区才能离开临界区。
而这样就导致socket的行为与阻塞方式发送无异,发送效率因此而被限制。

我觉得一个好的tcp socket处理框架,应该是只有一个线程来负责数据的收发,从而避免那些无穷无尽的同步问题。

评分

参与人数 1可用积分 +3 收起 理由
JohnBull + 3 我很赞同

查看全部评分

论坛徽章:
0
56 [报告]
发表于 2007-10-09 11:50 |只看该作者
MARK,谢谢到了,谢谢各位大虾
DaYuTou 该用户已被删除
57 [报告]
发表于 2007-10-09 18:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
58 [报告]
发表于 2007-10-15 23:45 |只看该作者
一般都是加锁的,因为会话层状态需要和socket层状态同步

论坛徽章:
0
59 [报告]
发表于 2007-10-17 10:23 |只看该作者
原帖由 selfrun 于 2007-10-9 10:20 发表
如果需要多个线程同时读访问或写访问同一个tcp socket, 那多半是程序设计上出了问题。

对于tcp的传输,都是要用应用层的协议保证接收方能解释对方发送过来的数据,这样,至少要保证一块数据是一个完整的协议 ...


正解!

论坛徽章:
0
60 [报告]
发表于 2007-10-17 13:41 |只看该作者
其实这种情况很常见,为什么说是设计的问题?
举个例子:
一个porxy服务器,一边连接客户端,一边连接服务端的80端口.对于每个客户的连接处理为一个线程,收到客户消息转发到服务器.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP