免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3346 | 回复: 2

[函数] [已解决]epoll多线程环境下,重复收到连接断开通知的问题 [复制链接]

论坛徽章:
0
发表于 2009-04-07 16:31 |显示全部楼层
主线程            : 创建epoll
accept    线程 :  接受连接
poll wait 线程 : 等待数据,如果有数据到来,将epoll_event*赋给下面的"事务处理"线程
事务处理  栈程 :  如果recv == 0. 就epoll_ctl 将 连接fd从epoll中删除.并且调用close函数关闭该fd.

如果去掉事务处理线程,将事务处理工作在poll wait线程中做的话,EPOLL可以正常工作.但是一分开,在连接关闭的时候,EPOLL就会不断收到重复的关闭通知.假设fd=7.那么就不断地有recv ( 7 ... ) == 0的通知.

我确定我使用了epoll_ctl将关闭的连接描述符从EPOLL中删掉了.

请教,这是怎么造成的?????

[ 本帖最后由 我learnc 于 2009-4-7 17:12 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2009-04-07 16:47 |显示全部楼层
我猜你说的“不断地收到recv == 0"的事件,可能是在你事务处理线程调用epoll_ctl 之前这段时间吧!

不过你这种模式我感觉有问题,不能用多线程去操作epoll中的事件池,最好将epoll_* API 都放到一个线程中做

论坛徽章:
0
发表于 2009-04-07 17:11 |显示全部楼层
主线程            : 创建epoll
accept    线程 :  接受连接
poll wait 线程 : 等待数据,如果有数据到来,如果recv > 0 赋给下面的"事务处理"线程
事务处理  栈程 :  俺是工人.....

----------------------------------俺是无耻的分割线----------------------------------------------

改成上面的模型以后,工作正常了. man还是太简单了.  谢谢楼上的指点.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP