應用場景是乙個生產者乙個消費者,兩者平均處理速度是相當的,但是有生產峰值速度太快,消費者處理速度跟不上的情況;
這種場景若用單執行緒處理,則會出現消費速度慢導致拖慢生產者的速度;
若使用雙線程處理,乙個生產線程乙個消費執行緒,這個時候就能用到佇列/環形佇列了。
佇列的資料結構其實非常簡單,實現方式主要為動態的鏈式結構或者為靜態的陣列結構,本文介紹一種靜態的陣列結構;
如上圖所示,入列時插入佇列尾,出列時由佇列頭彈出,用下標值進行位置標識。
約束是使用者資料必須是定長的資料,才能用靜態陣列結構去標識。
建立佇列,需要確定佇列大小以及每個使用者資料的長度
int bufqueue_create(bufqueue_t *phead, size_t nmemb, size_t item_size)
#define __ispower(_num_) ((_num_ ^ (_num_ - 1)) == (((_num_ - 1) << 1) + 1))
if ( !__ispower(nmemb) )
/* refree queue */
free_pointer(phead->queue);
phead->queue = (bufqueue_item *)calloc(nmemb, sizeof(bufqueue_item));
if ( !phead->queue )
for ( ix = 0; ix < nmemb; ix++ )
}phead->item_size = item_size;
phead->size = nmemb;
phead->mask = nmemb - 1;
phead->head = 0;
phead->tail = 0;
phead->used = 0;
printf("queue alloc success, size: %zd ( bytes )\n",
sizeof(bufqueue_t) + nmemb * item_size);
return success;
}
入列操作,分為獲取佇列尾,返回資料的指標給生成者,生產者生產資料後,更新佇列尾操作
void* bufqueue_tail(bufqueue_t *phead)
return (phead->queue[phead->tail].pitem);
}
int bufqueue_push(bufqueue_t *phead)
出列,消費者呼叫該介面直接獲取到資料指標,注意外部並不需要釋放空間
void* bufqueue_pop(bufqueue_t *phead)
pitem = phead->queue[phead->head].pitem;
phead->head = (phead->head + 1) & phead->mask;
phead->used--;
return (pitem);
}
判定佇列是否為空
int bufqueue_isempty(bufqueue_t *phead)
return failure;
}
判斷佇列是否滿
int bufqueue_isfull(bufqueue_t *phead)
if ( phead->head == ((phead->tail + 1) & phead->mask) )
return failure;
}
使用陣列佇列類似於犧牲空間換時間的方法,實現簡單。但要求使用者資料必須定長,並且會出現佇列滿的情況;
但是在索引方面,由於使用了下標法進行定位,可以快速地查詢到下乙個元素(head=(head + 1)&mask),這個時候也必須保證佇列大小為2^n;
同時在乙個生產者乙個消費者的場景下,使用該佇列可以無需上鎖,節省鎖的開銷;
資料結構 陣列佇列
佇列的實現還是依託於一開始所寫的陣列 資料結構 二次封裝自己的陣列 一 完成陣列基本功能 資料結構 二次封裝自己的陣列 二 公升級為泛型陣列 資料結構 二次封裝自己的陣列 三 公升級為動態陣列 下面是佇列的實現 class arrayqueue queue public arrayqueue pub...
資料結構 陣列佇列 迴圈佇列
佇列 是 先進先出 的資料結構,從隊尾入隊,從隊頭出隊。佇列中使用的array,參考 資料結構 手寫動態陣列 public inte ce queue public class arrayqueue implements queue public arrayqueue int capacity ov...
資料結構之陣列佇列
佇列的特性 1.佇列是一種線性資料結構,與陣列相比,佇列的方法是陣列的子集 2.向佇列中新增元素只能在隊尾進行,在隊首刪除元素 3.佇列是一種先進先出的資料結構 佇列的方法 1.void enqueue e e 向佇列中新增元素 2.e dequeue 從佇列中刪除元素 3.int getsize ...