在一讀一寫限制下,無鎖環形隊列的實現
轉載自:http://blog.csdn.net/kyee/archive/2009/03/28/4032746.aspx
環形一讀一寫隊列中,不需要擔心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()

{
Push_Count = 0;
Pop_Count = 0;
memset(List, 0, sizeof(List));
}
// 加入
bool Push(void* AData)

{
if (Push_Count - Pop_Count < Max_Count)
{
List[Push_Count & Max_Mask] = AData;
Push_Count++;
return true;
}
else
return false;
}
// 取出
void* Pop()

{
// 初始化
void* result = NULL;
// 判斷是否為空
if (Push_Count != Pop_Count)
{
result = List[Pop_Count & Max_Mask];
Pop_Count++;
}
// 返回結果
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()

{
Push_Count = 0;
Push_Index = 0;
Pop_Count = 0;
Pop_Index = 0;
memset(List, 0, sizeof(List));
}
// 加入
bool Push(void* AData)

{
if (Push_Count - Pop_Count < Max_Count)
{
List[Push_Index] = AData;
Push_Count++;
if (Push_Index == High_Index)
Push_Index = 0;
else
Push_Index++;
return true;
}
else
return false;
}
// 取出
void* Pop()

{
// 初始化
void* result = NULL;
// 判斷是否為空
if (Push_Count != Pop_Count)
{
result = List[Pop_Index];
Pop_Count++;
if (Pop_Index == High_Index)
Pop_Index = 0;
else
Pop_Index++;
}
// 返回結果
return result;
}
