免费注册 查看新帖 |

Chinaunix

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

libev的reactor模式的读写问题 [复制链接]

论坛徽章:
0
发表于 2012-01-07 17:21 |显示全部楼层
libev的reactor模式的读写通过回调实现,一般为了不阻塞loop,把socket设置成non-block模式。

一般的业务流程是: 在read_callback中接收协议数据---处理数据---设置write_event,然后在write_callback中发送处理后的结果。
现在的问题是,处理数据的时间较长,为了不影响loop,不放在read_callback中处理,塞入队列,由另外一个线程去pop队列并处理,但处理部分需要发送处理后的结果,
一个方法是可以在处理线程中设置对应的ev_io的write_event,但是问题是,在这之前或期间,如果对端关闭socket, ev_io会接收read事件,并销毁该ev_io。

一个解决方法是接收到一个协议之后,不再设置read_event,那就接收不到read result=0的消息,等到write_event之后再设回read_event;副作用是该socket只能一次接收一个协议,处理后才能接收第二个。

另一个方法是发送数据不放在ev_io的write_callback中,只把socket句柄给队列,并提供一个封装的send函数(处理EAGAIIN or EWOULDBLOCK or EINTR),让处理线程去发送。如果是这种方式的话,write_callback就没用了。

不知道大伙有什么其他好的方法?

论坛徽章:
0
发表于 2012-01-07 23:07 |显示全部楼层
libev谁开发的? C还是C++?

论坛徽章:
0
发表于 2012-01-08 20:02 |显示全部楼层
是c的,但有一个cpp的wrapper,由ev++.h提供

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
发表于 2012-02-06 12:02 |显示全部楼层
采用半同步半异步吧。

论坛徽章:
0
发表于 2012-05-23 17:05 |显示全部楼层
发现boost::weak_ptr()能解决这个问题。突然发现c++还是很美好的~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP