libevent中的尾佇列

2021-09-24 09:35:35 字數 3307 閱讀 7163

在 libevent 原始碼中,包括註冊事件佇列(eventqueue)啟用事件佇列(activequeues)在內的很多地方都用到了尾佇列這種資料結構。而尾佇列的實現有點複雜,因此寫一篇部落格分析一下~

2.1 entry結構體

libevent 中尾佇列的 entry(即尾佇列元素) 結構體定義如下:

#define tailq_entry(type) 

/* 尾佇列 entry */ \

struct

如**所示,entry 結構體包含了兩個成員:

2.2 隊頭結構體

libevent 中尾佇列的隊頭結構體定義如下:

#define tailq_head(name, type)	

/* 尾佇列隊頭 */ \

struct name

如**所示,隊頭結構體包含了兩個成員:

3.1 定義尾佇列

註冊事件佇列為例,libevent 原始碼中定義尾佇列的形式如下:

struct event_list;

tailq_head (event_list, event)

;

巨集展開後變成了:

struct event_list 

;

尾佇列作為 event_base 的eventqueue成員:

struct event_base 

;

而 tailq_entry 作為 event 的ev_next成員,如下:

struct event 

;

巨集展開後:

struct event ;.

..};

3.2 初始化尾佇列

libevent 原始碼中初始化尾佇列的實現如下:

#define	tailq_init(head) do  while (0)
初始化後,尾佇列頭狀態如下:

3.3 插入元素到隊尾

插入元素到隊尾的**實現如下:

#define tailq_insert_tail(head, elm, field) do  while (0)
呼叫方式為:

tailq_insert_tail

(&eventqueue, ev, ev_next)

;/* ev 是指向新插入 event 的指標 */

巨集展開後:

do

while(0

);

一共 4 行**,下面以畫圖的方式解釋每行**的作用:

插入前,有乙個已初始化的佇列頭乙個待插入的佇列元素

*(eventqueue)->tqh_last = (ev);,注意此時(eventqueue)->tqh_last指向eventqueue->tqh_first,因此這行**使eventqueue->tqh_first指向ev

3.4 刪除元素

刪除元素的**實現如下:

#define tailq_remove(head, elm, field) do  while (0)
呼叫方式為:

tailq_remove

(&eventqueue, ev, ev_next)

;/* ev 是指向待刪除 event 的指標 */

巨集展開後:

do

while(0

);

接著上圖,按行分析**:

*(ev)->ev_next.tqe_prev = (ev)->ev_next.tqe_next;,注意此時(ev)->ev_next.tqe_prev指向eventqueue->tqh_first,因此這行**使eventqueue->tqh_first指向null(因為此時(ev)->ev_next.tqe_next指向null)

最後呼叫相關函式釋放 ev 即可

libevent 中尾佇列的其它操作可同理分析,就不一一贅述了。

libevent資料結構尾佇列

1.概述 最近找來libevent的原始碼學習了一下,看到用巨集實現的資料結構甚是驚訝,把其中尾佇列的 copy出來test了一下.個人感覺用巨集實現該佇列的思想是c 的模板的思想.我自己實現乙個佇列的思路肯定是寫乙個佇列 中節點的結構體然後針對該結構體實現佇列的基本操作.這樣的佇列只能使用於寫好的...

尾指標迴圈佇列

佇列具有隊頭和隊尾,即頭指標和尾指標。本題要求只使用尾指標,在我們之前的 頭指標和計數器構成的迴圈佇列,我們使用了順序表構建只帶頭指標和計數器的佇列,在那篇文章中,我們使用頭指標和計數器找到了尾指標,所以能夠攻破題目。而此題只允許用乙個尾指標,該怎麼辦呢?回想單鏈表知識,我們只根據頭結點可以找到鍊錶...

棧模擬佇列尾插和頭刪

題目 這道題簡單難度,關鍵是聯想到棧和佇列的區別,棧 先進後出,佇列 先進先出。所以要想使用棧來模擬佇列,我們可以想到使用兩個棧不斷地 倒騰 資料 在新增元素到尾部的時候,若是棧一有元素,將全部元素壓入棧二,然後再直接將元素壓入棧二 在刪除佇列頭部元素時,將棧二的元素全部出棧到棧一,此時棧一頂部元素...