folly-EventBase

libevent学习笔记(参考libevent深度剖析)

  • folly::EventBase是基于libevent的event_base实现的。EventBaseBackendEventBaseBackendBase

  • folly::EventBase和线程不是强绑定,当EventBase执行loopXX方法时才会绑定到当前运行的线程: loopBody是每个loopXX方法都需要调用的。

    • folly::EventBase可以从线程池获取(IoThreadPoolExecutor)也可以自己创建,从线程池获取的eventbase。
  • loopXX(loopOnce、loop、loopForever)方法会运行event loop,进程事件的处理。

  • 一个EventBase只会运行在一个线程中。一个线程可以运行多个EventBase.

  • runInEventBaseThread(Func fn) : 在eventbase 线程中运行函数fn。线程安全,调用runInEventBaseThread()时,如果 EventBase loop不是正在运行中,则函数fn将在下一次loop开始时才被运行。如果loop已经运行完了,并且再也没有被重新运行(即再次调用loop函数等),那么在EventBase析构之前,函数fn会被运行。如果同一个线程调用多次runInEventBaseThread添加执行函数,那么这些函数将会被顺序执行。如果多个线程调用runInEventBaseThread添加执行函数,那么这些函数间的运行顺序将不固定。

  • runInEventBaseThreadAndWait: 和runInEventBaseThread类似。运行event base线程,并且等待运行结束。但是当调用者调用该方法时已经在event base 线程中了则会报错(比如:eventbase执行了loop但是还没执行完)。

  • runImmediatelyOrRunInEventBaseThreadAndWait: 和runInEventBaseThreadAndWait类似,但是,当调用者已经在event base 线程中时,就直接运行任务。否则就运行event base,并等待运行结束。

EvenetBaseManager

  • 管理每个线程的EventBase实例
  • static EventBaseManager* get();: 返回单例
  • getEventBase得到当前线程上的eventBase,如果不存在则创建
/**
   * Get the EventBase for this thread, or create one if none exists yet.
   *
   * If no EventBase exists for this thread yet, a new one will be created and
   * returned.  May throw std::bad_alloc if allocation fails.
   */
  EventBase* getEventBase() const;

推荐阅读更多精彩内容