• libevent


    6. 线程安全

    libevent不是线程安全的,libevnet里网络io都是单线程里处理。

    其它线程调用event_base_loopexit 和 event_base_loopbreak 并不会使当前线程从event_base_dispatch返回。

    同理,其它线程调用bufferevent_free,可能引起异常。


    所以,event_base_loopexit 和 event_base_loopbreak 以及 bufferevent_free的调用仅限于当前主线程的读写事件回调中,若从其它线程对event_base和bufferevent进行操作,或者达不到预期的效果,或者引起主线程的异常。



    5. 开启循环

    函数原型:

    #define EVLOOP_ONCE             0x01
    #define EVLOOP_NONBLOCK         0x02
    #define EVLOOP_NO_EXIT_ON_EMPTY 0x04


    int event_base_loop(struct event_base *base, int flags);

    功能:开启监测,循环监测注册在此event_base上的事件

    同类函数:

    int event_base_dispatch(struct event_base *base);

    等于不设置任何标志的event_base_loop,一直运行,直至注册在上面的事件全部关闭,或调用event_base_loopexit和event_base_loopbreak跳出循环



    4. 停止循环

    函数原型:

    int event_base_loopexit(struct event_base *base, const struct timeval *tv);

    int event_base_loopbreak(struct event_base *base);



    3. 开关读写事件

    函数原型:

    void bufferevent_enable(struct bufferevent *bufev, short events);

    void bufferevent_disable(struct bufferevent *bufev, short events);


    同时可以调用如下函数

    short bufferevent_get_enabled(struct bufferevent *bufev);

    查看对应bufferevent上开启的事件类型



    2. 事件回调函数

    函数原型:typedef void (*bufferevent_event_cb)(struct bufferevent *bev, short events, void *ctx);



    1. 设置超时

    函数原型:void bufferevent_set_timeouts(

                                    struct bufferevent *bufev, 

                                    const struct timeval *timeout_read, 

                                    const struct timeval *timeout_write);

    参数:超时指针为NULL,表示对应操作无超时,同时抹除之前已设置的超时

    说明:相应操作未开启,则超时设置无意义,永不触发


    回调

    a. 指定的时间内,套接字上无数据到达,则触发读超时;写超时,暂未掌握

    b. 超时发生,则以BEV_EVENT_TIMEOUT|BEV_EVENT_READING 或 BEV_EVENT_TIMEOUT|BEV_EVENT_WRITING事件标志位调用事件回调函数bufferevent_event_cb

    c. 读写超时发生,则该bufferevent上对应的读操作或写操作自动失效,若想继续等待,需调用bufferevent_enable开启事件

  • 相关阅读:
    mac creact-react-app 时包 gyp-error
    JAVA,JDBC报错Access denied for user '"root"'@'localhost
    JAVA,JDBC连接数据库报错:No suitable driver found for "jdbc:mysql://localhost:3306
    JAVA,反射使用demo,通过读取配置文件创建类,调用方法
    JAVA,反射获取class对象的3种方式
    python获取当前时间距离指定时间相差的秒值
    JAVA,字节流文件读写
    JAVA,反射常用方法
    JAVA,字符流读写,flush和close的区别
    JAVA,字符流文件读写
  • 原文地址:https://www.cnblogs.com/chaikefusibushiji/p/6775738.html
Copyright © 2020-2023  润新知