環形一讀一寫佇列中,不需要擔心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...