zlMediaKits基本库ZLToolKits中的EventPoller实现分析

1.创建TCPService中会调用EventPollerPool,因为EventPollerPool是单例所以会实例化,EventPollerPool是一个线程调用模型,可以参考epoll
在这里插入图片描述

2.实例化EventPollerPool 调用createThreads,并传入线程数,线程可以通过-t 参数指定,不指定则使用默认个数。每一个线程对应一个EventPoller,并运行EventPoller.runLoop

3.EventPoller中runLoop由单独的线程运行,并包括阻塞模式和非阻塞模式,如果非阻塞模式会在调用的线程上新启用一个线程来调用runLoop,并立即返回。runLoop主要的工作是监听_event_map中注册的fd(sock)。linux和window有分别的实现,window采用select实现,将需要读、写、异常的sock存放fd_set,然后调用select过滤出有数据(事件)的fd(sock),当发现有读写异常等相关操作的fd(sock)就调用该fd(sock)的回调事件。
在这里插入图片描述

4.EventPoller中采用管道_pipe实现工作线程(注册事件)和Poller线程(执行事件runLoop)进行交互。_pipe的内部采用socket非阻塞模式,该socket接收端为Poller线程,发送端为工作线程,通过调用EventPoller::async向Poller线程执行回调。
在这里插入图片描述

5.EventPoller中通过addEvent注册监听fd(sock) 读写异常 事件,通过Poll_Record定义事件注册对象,并加入到_event_map中, 并通过async接口通知Poller线程有新的fd加入。 再由第3步的runLoop循环发现并触发事件。
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值