zoukankan      html  css  js  c++  java
  • libevent2源码分析之一:前言

    event的本质

    libevent2中的event的本质是什么?只要是非同步阻塞的运行方式,肯定遵循事件的订阅-发布模型。通过event_new的函数原型可以理解,一个event即代表一次订阅,建立起了fd变化的事件与callback响应函数之间的一个关联。

     

    订阅-发布模型有四个方面,事件定义、事件订阅、事件触发、事件响应。libevent2与之的对应关系如下:

    * 事件定义:由系统定义,比如IO相关的源(如socket)有read/write事件。libevent2定义了4个类型的事件:EV_TIMEOUT、EV_READ、EV_WRITE、EV_SIGNAL

    * 事件订阅:由用户在代码中完成订阅,通过新建event对象并调用event_add实现事件的订阅。新建的event对象中就包含了关注的源是哪个fd, 关注的事件是四个事件中的哪些(一般只关注一个事件),关联的回调函数是什么。通过event_addevent添加到事件监听队列中。

    * 事件触发:由libevent2底层负责,底层实现有多种方式,select为其中的一种。对于select方式,调用select()返回的可读列表即触发EV_READ事件,返回的可写列表即触发EV_WRITE事件。那么由谁来发起调用select()函数呢?通过调用event_base_dispatch()来发起调用。由此也可以看到event_base的作用。一旦事件被触发,就会将与该fd关联的事件监听队列中的所有的event添加就绪队列中。

    * 事件响应:由libeventevent_base负责,处理就绪队列,对于队列中的每个event, 调用它的回调函数。

     

    使用libevent2的流程

     

    1. 调用event_base_new()创建一个event_ base对象。
    2. 调用event_new(base, fd, flag, callback, args)创建一个event对象
    3. 调用event_add(event, NULL)添加event,即添加对fd通知事件的响应
    4. 调用event_base_dispatch(base)开始事件轮询。

     

     下一篇将按照这个流程分析libevent2的源代码。

     

  • 相关阅读:
    c# 委托
    datagrid加下拉列表dropdownlist
    MySQL存储过程的基本函数(三)
    MySQL存储过程详解 mysql 存储过程(二)
    MySQL存储过程(一)
    SFTP 文件上传下载引用代码
    JAVA SFTP文件上传、下载及批量下载
    java中遍历MAP的几种方法
    POSTGRESQL 导入导出
    db2move 数据导出整理
  • 原文地址:https://www.cnblogs.com/qkhh/p/3679323.html
Copyright © 2011-2022 走看看