1. 程式人生 > >看了這麽多天後對libevent的理解

看了這麽多天後對libevent的理解

做的 clas per 設置 事件 color 同時 時間管理 應該

很詳細的看了一下相關的源碼和博客,還是記不住具體怎麽實現的,還是先把整體框架給寫出來吧。

首先,libevent是事件驅動的,也就是event,因此,所有這些都是圍繞event展開的。libevent的事件分為普通IO事件,超時事件,和信號事件。

這麽多事件,應該怎麽管理呢,這個時候event_base就出現了。

struct event_base* base = event_base_new();//創建一個管理event的event_base對象,這個結構體中包含了好多內容,比如後端IO復用的選擇,激活事件的隊列,已經添加的隊列
//等等,反正後面需要用到管理的,都是在event_base中,對了,還有時間管理的小根堆,我是記不住有哪些,賊多。

有了這個管理者,接下來就可以構造事件了。

struct event* ev = event_new(base, fd, EV_READ|EV_PERSIST, cb, arg);

忘了說了,libevent是一個非阻塞的異步通訊模型,這是因為,你只需要把你監聽的文件描述符(fd),已經關心的觸發的事件(EV_READ|EV_PERSISE),同時如果事件發生之後應該怎麽處理的回調函數(cb),在構建event的時候放到event中,那麽接下來所有的事情都是由event_base來進行管理的調度,你就不用管了,對應的事件發生就會調用對應的回調函數。其實,本質上說,libevent僅僅是多了一層封裝,如果之前你有使用過epool的經歷,那麽就會稍微容易理解一點,本質上,libevent也是調用系統的IO復用函數。

好了,到這裏位置,事件已經構建出來了,這個時候就可以聊一些事件的狀態了。

像剛剛創建好的event,還沒有加入到event_base中,這些事件成為init事件,也就是初始化事件。

如果一個event加入到了event_base中,這些事件稱為insereted事件,也就是已經插入事件。

如果一個event上面發了對應監控的事件,這些事件稱為activate事件。就先說這幾個事件吧,後面還會在合適的場合添加事件的類型。

接下來,就可以將event添加到event_base中了。

event_add(ev, NULL);

上面這行代碼沒有設置事件的超時時間,也就是會一直等待調用,直到對應的事件發生,才會進行返回。

接下來,就是event_base開始對這些事件進行監管了。

event_base_dispatch(base);//開始監管這些事件,裏面實現是一個while循環

最後,需要做的就是釋放base資源,因為這些內存資源都是從堆上申請的,因此需要手動進行資源的釋放工作。

event_base_free(base);

看了這麽多天後對libevent的理解