ACE Reactor和Proactor框架
这段时间工作需要一直用ace框架开发,由一窍不通渐渐明白了一些,最可气的是这方面的文档又不全面 ,公司也不能上外网,到最后完全是看代码看出来些许头目。 Reactor框架是按照相关帮助上所说的那样,在windows平台上是根据WaitForMultiObjects实现的 边缘触发,是类似与电路中的上升沿触发,当条件具备后(相关操作可以进行),就触发Svc_Handler的 虚函数。 是说,只剩下62个句柄供程序使用。刚开始用Reactor写架构,最后才发现居然有这个限制,迫不得已必 须改成Proactor框架。 Proactor框架没有Reactor框架看起来容易懂,刚开始我甚至奇怪:没有一个句柄保存相关对端信 息,handle_read_stream和 handle_write_stream甚至就给你提供好了你要收发的数据,而且没有对端信 息给你,是怎么区分不同的消息的?? 仔细查阅了一下,才明白Proactor是基于异步IO的框架,对每一个对端连接,都会新建一个 Service_Handler来处理(当对端断开后并不清除,而是会重复使用),对端信息在Service_Handler的 address挂钩方法可以获取,需要自己保存。而数据是在“已准备好”的情况下才通知相关handler处理, 整个框架是基于类似与电平触发的,当事件完成后通知,而不是“可以操作”时通知,因此在 handle_read_stream中你直接获取了你想要读取的数据,当然如果你需要更多的数据,需要将原先的 Message_Block传入继续读。 方法,从此时开始进入Proactor框架循环,open中的read方法完成后,会进入handle_read_stream,在这 里面通常的业务处理就是根据请求,生成一个响应,然后调用Asynch_Writer_Stream的write方法,write 结束后会通知到handle_write_stream,这里通常就会再开一个read,再次进入handle_read_stream。 工模式,可以在handle_read_stream中write响应并启动下一次read。 感觉上,使用ACE最大的方便是对自己的工作不需要做太多移植方面的考虑,而最大的不便就是相 关文档太少,自带的帮助根本不能用。而且现在还遇到一个问题,开始了事件循环以后不知道怎样“安全 ”的结束。Reactor::end_reactor_event_loop和 Proactor::end_event_loop都不能完全结束相关启动的 线程循环,强行结束后会有一大堆内存泄漏等着你。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |