libevent資料結構尾佇列

2021-08-09 10:36:27 字數 3081 閱讀 2556

1.概述

最近找來libevent的原始碼學習了一下,看到用巨集實現的資料結構甚是驚訝,把其中尾佇列的**copy出來test了一下.個人感覺用巨集實現該佇列的思想是c++的模板的思想.我自己實現乙個佇列的思路肯定是寫乙個佇列 中節點的結構體然後針對該結構體實現佇列的基本操作.這樣的佇列只能使用於寫好的節點….而libevent實現的版本是不依賴於實際的節點的.換句話說,我們有兩個類,乙個student,乙個teacher,該佇列既可以把student 作為佇列連線起來,也可以將teacher連線起來.相當於 taiq ,taiq. 而且針對同乙個結構體(類) 可以實現多個佇列,比如說所有學生連線成乙個佇列,再把其中的男學生連線為乙個佇列.

2實現

#define tailq_head(name, type)                      \

struct name

#define tailq_head_initializer(head) \

#define tailq_entry(type) \

struct

/* * tail queue access methods

*/#define tailq_first(head) ((head)->tqh_first)

#define tailq_end(head) null

#define tailq_next(elm, field) ((elm)->field.tqe_next)

#define tailq_last(head, headname) \

(*(((struct headname *)((head)->tqh_last))->tqh_last))

/* *** */

#define

tailq_prev

(elm, headname, field) \

(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))

#define

tailq_empty

(head) \

(tailq_first(head) == tailq_end(head))

#define

tailq_foreach

(var, head, field) \

for((var) = tailq_first(head); \

(var) != tailq_end(head); \

(var) = tailq_next(var, field))

#define

tailq_foreach_reverse

(var, head, headname, field) \

for((var) = tailq_last(head, headname); \

(var) != tailq_end(head); \

(var) = tailq_prev(var, headname, field))

/* * tail

queue

functions.

*/#define

tailq_init

(head)

do while (0)

#define tailq_insert_head(head, elm, field) do while (0)

#define tailq_insert_tail(head, elm, field) do while (0)

#define tailq_insert_after(head, listelm, elm, field) do while (0)

#define tailq_insert_before(listelm, elm, field) do while (0)

#define tailq_remove(head, elm, field) do while (0)

#define tailq_replace(head, elm, elm2, field) do while (0)

3測試

針對最後乙個功能點進行了簡單的測試,以加深記憶和理解

#include "queue.h"

#include

#include

#define nqueue 5

struct

event;

tailq_head(eventqueue,event);

tailq_head(activequeue,event);

struct eventqueue event_queue_head;

struct activequeue active_queue_head;

void init()

int main()

struct

event* var = null;

tailq_foreach(var,&event_queue_head,queue_field)

printf("\n");

tailq_foreach(var,&active_queue_head,active_queue_field)

return

0;}

實現了乙個結構體 event , 申請了5個event 並把它們連線成兩個佇列.乙個佇列中包含了所有的event,乙個佇列中包含了值為偶數的event.

列印結果:

~/***x ᐅ ./a.out

the valueis0

the valueis1

the valueis2

the valueis3

the valueis4

the valueis0

the valueis2

the value

is4

libevent中的尾佇列

在 libevent 原始碼中,包括註冊事件佇列 eventqueue 和啟用事件佇列 activequeues 在內的很多地方都用到了尾佇列這種資料結構。而尾佇列的實現有點複雜,因此寫一篇部落格分析一下 2.1 entry結構體 libevent 中尾佇列的 entry 即尾佇列元素 結構體定義如...

資料結構 佇列

一 佇列的迴圈陣列實現。1 初始化 空佇列。令rear front 0。2 入佇列 約定rear指向佇列尾元素的下乙個位置。入佇列時,先判斷佇列是否已滿,而後將array rear x 然後rear 3 出佇列 約定front指向佇列的首元素位置。出佇列時,先判斷佇列是否為空,而後返回隊首元素re ...

資料結構 佇列

資料參考自 資料結構c 語言描述 佇列是一種先進先出的資料結構,這與棧正好相反。下例是簡單的queue實現 queue.h檔案 ifndef queue h define queue h include include 資料元素結構 自定義 struct datatype 佇列元素最大數 const...