1、ACE_WFMO_Reactor()->run_reactor_event_loop()事件之前,需要进行ACE_WFMO_Reactor()->owner(ACE_OS::thr_self())这样的调用,以指定使用当前线程进行事件转发。否则使用msg_queue的notify策略进行写事件的触发来进行handle_output的回调会只调用一两次,不会进行多次回调有问题,原因正在进一步分析。
2、ACE_WFMO_Reactor()这个reactor使用的是WaitForMultipleObjectEx进行IO多路事件转发,所以它的FD_WRITE的事件触发是边缘触发(ET),只有socket连接成功时或者send遇到EWOULDBLOCK之后,当socket又变为可写入时才会回调。在进行send处理时,需要考虑在handle_out的入口里进行WRITE_MASK的取消cancel_wakeup(handle, ACE_Event_Handler::WRITE_MASK),以及在send返回-1,且errno = EWOULDBLOCK时,schedule_wakeup(handle, ACE_Event_Handler::WRITE_MASK)来进行写事件的注册,以便当socket可写时可以由reactor即时回调handle_output。
阅读(12447) | 评论(0) | 转发(0) |