免费注册 查看新帖 |

Chinaunix

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

多线程同时调用send函数的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-02 09:28 |只看该作者 |倒序浏览
在arm-linux下编写的一个多线程应用程序,此程序作为tcp client,需要连接到一个WIN TCP SERVER上,并与之进行tcp数据
通讯,现在的疑问tcp send函数被我封装成一个专用的发送接口函数供其他函数调用,这个函数可能同时被多个线程中的函数进行
调用,这样是否会有问题,是否需要在send函数那里加线程互斥锁呢?

thanks in advance

论坛徽章:
0
2 [报告]
发表于 2008-11-02 11:41 |只看该作者

回复 #1 qks5201314 的帖子

应该没有问题,只要这个函数是可重入的就没有问题。send系统调用本身是线程安全的。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
3 [报告]
发表于 2008-11-02 15:18 |只看该作者

回复 #1 qks5201314 的帖子

理论上可以,实践中基本没有可操作性。虽然send线程安全并且可重入,但多种情况都会导致各线程的消息片段交叉起来:
1,信号中断
2,阻塞IO时,线程A写入部分数据阻塞,缓存可写时不一定仍调度线程A,可能是其它线程
3,非阻塞IO时,线程A可能写入部分数据返回,然后可能调度其它线程继续写入
可行的方案是一个线程处理多个network IO或者一个线程处理一个network IO。基本没有多个线程处理一个network IO,不仅需要加锁保持消息的完整性(注:不是线程安全意义上的加锁,而是程序逻辑的完整性),而且会极大降低线程并发性能

论坛徽章:
0
4 [报告]
发表于 2008-11-02 19:56 |只看该作者
我现在用的是tcp阻塞发送数据,如果按照楼上的说法,我是现在有多个线程需要进行TCP发送数据,应该具体如何操作比较安全呢?谢谢

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
5 [报告]
发表于 2008-11-02 21:01 |只看该作者

回复 #4 qks5201314 的帖子

1,每个线程一个连接与服务端通信

2,多个线程把数据put到队列中,由另一个线程负责发送

论坛徽章:
0
6 [报告]
发表于 2008-11-03 09:51 |只看该作者

回复 #5 timespace 的帖子

恩,感觉第二种方法容易实现些,第一种方法不知道该如何操作的?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
7 [报告]
发表于 2008-11-03 14:50 |只看该作者

回复 #6 qks5201314 的帖子

第一种方法有前提:Server要支持多个连接
每个线程一个连接其实比第二种方法简单。不过最好还是处理IO的线程独立出来

论坛徽章:
0
8 [报告]
发表于 2008-11-03 17:37 |只看该作者

回复 #7 timespace 的帖子

我现在在用第二种方法测试了,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP