C++學(xué)習(xí)筆記(十六) - 典型的事件驅(qū)動設(shè)計模式-Reactor模式

參考文獻(xiàn):libevent源碼深度剖析二
這是libevent學(xué)習(xí)過程的一個基礎(chǔ)補(bǔ)充

1 Reactor的事件處理機(jī)制

普通的函數(shù)調(diào)用機(jī)制的流程是這樣的:調(diào)用函數(shù)-函數(shù)執(zhí)行-返回結(jié)果-程序繼續(xù)處理
Reactor則是一種事件驅(qū)動的機(jī)制陨溅,這在C#孝偎,Qt等程序中都有所體現(xiàn)褥蚯,即應(yīng)用程序提供接口注冊到Reactor上漆改,相應(yīng)的事件發(fā)生時诗舰,Reactor自動調(diào)用這個接口,這個接口也被稱為“回調(diào)函數(shù)”祖秒。

2 Reactor模式的優(yōu)點(diǎn)

Reactor模式是編寫高性能網(wǎng)絡(luò)服務(wù)器的必備技術(shù)之一聂喇,它具有如下的優(yōu)點(diǎn):
1)響應(yīng)快,不必為單個同步時間所阻塞儒洛,雖然Reactor本身依然是同步的精耐;
2)編程相對簡單,可以最大程度的避免復(fù)雜的多線程及同步問題琅锻,并且避免了多線程/進(jìn)程的切換開銷卦停;
3)可擴(kuò)展性,可以方便的通過增加Reactor實(shí)例個數(shù)來充分利用CPU資源恼蓬;
4)可復(fù)用性惊完,reactor框架本身與具體事件處理邏輯無關(guān),具有很高的復(fù)用性处硬;

3 Reactor模式框架

使用Reactor框架小槐,必備的幾個組件:事件源,Reactor框架郁油,多路復(fù)用機(jī)制和事件處理程序本股,先來看看Reactor模型的整體框架:

整體框架

1)事件源
描述符由操作系統(tǒng)提供攀痊,用于識別每一個事件桐腌,如Socket描述符拄显、文 件描述符等。在Linux中案站,它用一個整數(shù)來表示躬审。事件可以來自外部,如來自客戶端 的連接請求蟆盐、數(shù)據(jù)等承边。事件也可以來自內(nèi)部,如定時器事件石挂。
Linux上是一個整數(shù)的描述符博助,Windows上就是Socket或者Handle,程序在指定的句柄上注冊關(guān)心的事件痹愚。
2)event demultiplexer——事件多路分發(fā)機(jī)制
是一個函數(shù)富岳,用來等待一個或多個事件的發(fā)生。調(diào)用者會被阻 塞拯腮,直到分離器分離的描述符集上有事件發(fā)生窖式。Linux的select函數(shù)是一個經(jīng)常被使 用的分離器。
程序首先將其關(guān)心的句柄及事件注冊到event demultiplexer上动壤,當(dāng)有事件到達(dá)時萝喘,event demultiplexer會發(fā)出通知“在已經(jīng)注冊的句柄集中,一個或多個句柄的事件已經(jīng)就緒”琼懊,程序收到通知后阁簸,就可以在非阻塞的情況下對事件進(jìn)行處理了。
3)Reactor——反應(yīng)器
Reactor哼丈,是事件管理的接口启妹,內(nèi)部使用event demultiplexer注冊、注銷事件削祈;并運(yùn)行事件循環(huán)翅溺,當(dāng)有事件進(jìn)入“就緒”狀態(tài)時,調(diào)用注冊事件的回調(diào)函數(shù)處理事件髓抑。
對應(yīng)到libevent中咙崎,就是event_base結(jié)構(gòu)體。
一個典型的Reactor聲明方式:

    class Reactor  
    {  
    public:  
        int register_handler(Event_Handler *pHandler, int event);  
        int remove_handler(Event_Handler *pHandler, int event);  
        void handle_events(timeval *ptv);  
        // ...  
    };  

4) Event Handler——事件處理程序
事件處理程序提供了一組接口吨拍,每個接口對應(yīng)了一種類型的事件褪猛,供Reactor在相應(yīng)的事件發(fā)生時調(diào)用,執(zhí)行相應(yīng)的事件處理羹饰。通常它會綁定一個有效的句柄伊滋。
對應(yīng)到libevent中碳却,就是event結(jié)構(gòu)體。
下面是兩種典型的Event Handler類聲明方式笑旺,二者互有優(yōu)缺點(diǎn)昼浦。

    class Event_Handler  
    {  
    public:  
        virtual void handle_read() = 0;  
        virtual void handle_write() = 0;  
        virtual void handle_timeout() = 0;  
        virtual void handle_close() = 0;  
        virtual HANDLE get_handle() = 0;  
        // ...  
    };  
    class Event_Handler  
    {  
    public:  
        // events maybe read/write/timeout/close .etc  
        virtual void handle_events(int events) = 0;  
        virtual HANDLE get_handle() = 0;  
        // ...  
    };  

4 Reactor事件處理流程

事件處理流程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市筒主,隨后出現(xiàn)的幾起案子关噪,更是在濱河造成了極大的恐慌,老刑警劉巖乌妙,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件使兔,死亡現(xiàn)場離奇詭異,居然都是意外死亡藤韵,警方通過查閱死者的電腦和手機(jī)虐沥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泽艘,“玉大人欲险,你說我怎么就攤上這事∠づ瑁” “怎么了盯荤?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長焕盟。 經(jīng)常有香客問我秋秤,道長,這世上最難降的妖魔是什么脚翘? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任灼卢,我火速辦了婚禮,結(jié)果婚禮上来农,老公的妹妹穿的比我還像新娘鞋真。我一直安慰自己,他們只是感情好沃于,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布涩咖。 她就那樣靜靜地躺著,像睡著了一般繁莹。 火紅的嫁衣襯著肌膚如雪檩互。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天咨演,我揣著相機(jī)與錄音闸昨,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛饵较,可吹牛的內(nèi)容都是我干的拍嵌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼循诉,長吁一口氣:“原來是場噩夢啊……” “哼横辆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起打洼,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤龄糊,失蹤者是張志新(化名)和其女友劉穎逆粹,沒想到半個月后募疮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僻弹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年阿浓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹋绽。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡芭毙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卸耘,到底是詐尸還是另有隱情退敦,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布蚣抗,位于F島的核電站侈百,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翰铡。R本人自食惡果不足惜钝域,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锭魔。 院中可真熱鬧例证,春花似錦、人聲如沸迷捧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漠秋。三九已至笙蒙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膛堤,已是汗流浹背手趣。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绿渣。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓朝群,卻偏偏與公主長得像,于是被迫代替她去往敵國和親中符。 傳聞我的和親對象是個殘疾皇子姜胖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)淀散,斷路器右莱,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 轉(zhuǎn)自http://blog.csdn.net/xugangwen/article/details/44811783...
    扎Zn了老Fe閱讀 12,727評論 1 142
  • 本文是Netty文集中“Netty 那些事兒”系列的文章。主要結(jié)合在開發(fā)實(shí)戰(zhàn)中档插,我們遇到的一些“奇奇怪怪”的問題慢蜓,...
    tomas家的小撥浪鼓閱讀 15,503評論 3 35
  • 這一年,我畢業(yè)了 之前的生活郭膛,簡直就是張白紙晨抡,似乎除了吃飯睡覺就是學(xué)習(xí)了。 初入職場则剃,我手足無措耘柱,唯一的感覺就是無...
    朢文閱讀 209評論 0 1
  • 半夜3點(diǎn),電話響了棍现。一哥們打來電話說:兄弟调煎,我車?yán)飽|西被偷了。我說:哥們那先報警啊己肮。哥們說:不是啥值錢的玩意士袄,方向...
    FC展翅飛翔閱讀 173評論 0 0