免费注册 查看新帖 |

Chinaunix

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

[C] 同一个sock fd上两个线程同步问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2014-04-15 23:40 |只看该作者
lz,可以读写分两线程,完全没问题,send和recv可同时调用。

数据的同步要考虑数据流。比如必须先有recv才有send,那么recv完毕之后把数据投递给send线程处理即可。
至于fd本身,肯定是数据流末端的线程去关闭,比如recv可以投递一个特殊信号给send,让send去关闭fd,因为send总在recv之后。send失败可以直接关闭,然后忽略之后recv线程投递过来的特殊信号。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
22 [报告]
发表于 2014-04-16 09:28 |只看该作者
回复 20# socay2

读写线程基本没有一起运行的,总是一个等另一个 为什么要等?发送断只要有数据就发送,接收端只要缓存够就接收。


那处理逻辑放在哪里?除非处理逻辑的速度超过网络吞吐量,否则大部分时间还是卡在处理逻辑上,把客户端发来的请求都缓存下来意义也不是特别明显。
你说的这种架构对于Proxy类的程序还可以用,但是在其它场景就没什么优势了,最大的问题就是复杂度上升很多。

话说写个server,又没什么太高的性能要求,搞那么复杂干吗?

论坛徽章:
0
23 [报告]
发表于 2014-04-16 17:17 |只看该作者
Create 2 socket, one for send , another for receive

论坛徽章:
0
24 [报告]
发表于 2014-04-16 20:02 |只看该作者
你可以尝试用libevent进行socket事件监听~这样就不会有问题

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
25 [报告]
发表于 2014-04-17 01:37 |只看该作者
回复 22# windoze


    我对web server这种架构了解不深,很多观点纯属扯淡。
对了,你说现代 server 响应多用户并发问题,是否都是采用 针对每个用户一个线程的方式来 提高交互体验呢?

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
26 [报告]
发表于 2014-04-17 10:08 |只看该作者
一个线程专门负责将协议数据读入一个循环缓冲中。另一个线程专门负责从循环缓冲中读取协议数据并处理和发送结果。
如果读线程发现套接字关闭,则需要设计一个关闭的协议数据并写入循环缓冲中,并执行读线程结束处理。处理线程读取到关闭数据,则执行写线程结束处理。
这里的循环缓冲需要一些互斥和信号量来处理。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
27 [报告]
发表于 2014-04-17 11:00 |只看该作者
回复 23# dspecialtwo

明明一个socket就可以完成的事,为什么要用两个socket?

   

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
28 [报告]
发表于 2014-04-17 11:02 |只看该作者
回复 25# socay2

这个问题就扯远了,你可以翻翻以前的帖子,很多讨论这个的
   

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
29 [报告]
发表于 2014-04-17 13:07 |只看该作者
回复 26# cobras


    感谢cobras回复

   两个线程操作同一个队列,的确需要信号量或锁

   如果链接断开,读线程没有向队列中加入指示写线程退出的消息,只是将fd置0

   写线程,发现socket_fd不可用的时候,即send失败,则认为链接已经断开

   所以写线程就直接清空当前队列,并退出


  以上,谢谢

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
30 [报告]
发表于 2014-04-17 13:12 |只看该作者
回复 29# Dannysd

谁告诉你socket读失败就不能写了(或者反之)?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP