libevent学习笔记(参考libevent深度剖析)
-
folly::EventBase是基于libevent的event_base实现的。EventBaseBackend、EventBaseBackendBase
-
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;
网友评论