重构了MTAPI 的event loop

来源:互联网 发布:js null 与 undefined 编辑:程序博客网 时间:2024/04/25 10:22

      MTAPI 创建后,一直使用基于Apple一个开源的工具库来提供跨平台封装,其中的事件循环自行改了几次,比较稳定,但是代码的确有些丑陋。

    

      最近因为工作需要,参考了一下Android的RIL_event,很简洁的提供了一个漂亮的select event loop,还支持定时器,于是动了借鉴的念头。

     

      google一下,原来网上已经很多开源的event loop库,有的还实现了基于epoll的异步多路IO,真是强大。。。不过用不着,我只是写一个简单的进程间通讯组件。另外,Apple开源库的事件循环Windows上的实现是基于一个隐藏的窗口,但winsock2中已经提供了select,所以本次重构时,一并修改了过来。

 

总结起来,实现一个基于select的异步多路IO的要点是:

  1. 一个线程,用于阻塞在select调用上,在读写集可用或者超时后立刻返回,检查所发生的事件
  2. 一对额外的PIPE描述符或者一对socket描述符,用于修改读写集后唤醒线程。windows上没有本地socket,也不支持select pipe,没关系,你google一个开源的socketpair的实现
  3. 一个listen端口,其套接字设置在读集中,用于accept 新连接。
  4. 事件发生后,直接调用与套接字相关的回调。需要的主要是,回调函数的实现需要保持高效简短,尽可能快的返回,通常具体的处理工作通知给其他线程就可以了。
原创粉丝点击