1. 什么是無鎖隊(duì)列
字面意思理解,就是兩個(gè)線程同步操作某種數(shù)據(jù)時(shí),不能加鎖;
因?yàn)榧渔i是會(huì)拖慢效率,造成延時(shí)的;
2. 什么場(chǎng)景需要用到無鎖隊(duì)列呢?
最典型的是生產(chǎn)者和消費(fèi)者模型,要求生產(chǎn)者生產(chǎn)的同時(shí),進(jìn)行消費(fèi),這就要求足夠的低延時(shí),此時(shí)可以使用無鎖隊(duì)列;
比如:
線程A生產(chǎn) 1,2,3,4...
線程B對(duì)生產(chǎn)出來的數(shù)相加,要求效率足夠高,不能用鎖,此時(shí)就可以用無鎖隊(duì)列。
3. 無鎖隊(duì)列的實(shí)現(xiàn)
#define MAX_NUMBER 1000
#define OK 0
#define ERROR -1
typedef struct _QUEUE_DATA
{
int iData[MAX_NUMBER];
int head;
int tail;
}QUEUE_DATA;
QUEUE_DATA* pHead = new QUEUE_DATA;
pHead->head = 0;
pHead->tail = 0;
//從隊(duì)尾加入數(shù)據(jù),隊(duì)列是一個(gè)環(huán)形隊(duì)列
int push_data(QUEUE_DATA* pHead, int data)
{
if ( pHead == NULL || (pHead->head == ((pHead->tail +1) % MAX_NUMBER) ) )
{
return ERROR;
}
pHead->iData[pHead->tail] = data;
pHead->tail = (pHead->tail+1)%MAX_NUMBER;
return OK;
}
int pop_data(QUEUE_DATA* pHead)
{
if (pHead == NULL || (pHead->head == pHead->tail))
{
return ERROR;
}
pHead->iData[pHead->head] = 0;
pHead->head = (pHead->head+1)%MAX_NUMBER;
return OK;
}