無鎖環形佇列

2021-05-23 02:26:41 字數 1201 閱讀 1845

環形一讀一寫佇列中,不需要擔心unsigned long溢位問題,因為溢位後自動回歸,相減值還會保留。

示例一(注:max_count 必須為 2 的指數,即:2, 4, 8, 16...):

// 佇列尺寸

#define max_count 4096

#define max_mask 4095 // = max_count - 1

// 變數

void

*list

[max_count]

;unsigned

long push_count;

unsigned

long pop_count;

// 初始化佇列

void initqueue(

)// 加入

bool push(

void

* adata)

else

return

false;}

// 取出

void

* pop(

)// 返回結果

return result;

}

示例二(注:max_count >= 2):

// 佇列尺寸

#define max_count 4096

#define high_index 4095 // = max_count - 1

// 變數

void

*list

[max_count]

;unsigned

long push_count;

unsigned

long push_index;

unsigned

long pop_count;

unsigned

long pop_index;

// 初始化佇列

void initqueue(

)// 加入

bool push(

void

* adata)

else

return

false;}

// 取出

void

* pop(

)// 返回結果

return result;

}

環形無鎖佇列

1 元素是先進先出的 由佇列的性質保證的,在環形佇列中通過對佇列的順序訪問保證 2 空間可以重複利用 因為一般的環形佇列都是乙個元素數固定的乙個閉環,可以在環形佇列初始化的時候分配好確定的記憶體空間,當進隊或出隊時只需要返回指定元素記憶體空間的位址即可,這些記憶體空間可以重複利用,避免頻繁記憶體分配...

dpdk無鎖環形佇列的使用

入口使用dpdk,資料報解包分析後續處理執行緒效能太低,cpu很大一部分浪費在多執行緒鎖開銷上,於是想用dpdk無鎖佇列,看是否有改善。使用前不知道dpdk的ring是否能在收發包之外使用,也沒找到實際使用跟收發包無關的例子 也不需要使用mbuf,需要儲存乙個指標的佇列,直接拿過來用看看可不可以。前...

mySQL無鎖佇列 go 無鎖佇列

無鎖佇列適用場景 兩個執行緒之間的互動資料,乙個執行緒生產資料,另外乙個執行緒消費資料,效率高 缺點 需要使用固定分配的空間,不能動態增加 減少長度,存在空間浪費和無法擴充套件空間問題 package main import fmt reflect strings time type loopque...