關於無鎖隊列的概念與實現,可以參考博文《無鎖隊列的實現》,主要涉及到的知識點包括CAS原子操作、無鎖隊列的鏈表實現、無鎖隊列的數組實現以及ABA問題。
下面借鑒了《多線程的那點兒事(之無鎖隊列)》的代碼,說明兩個線程(一個添加一個讀取數據)之間的無鎖隊列,可以不借助線程互斥方法就能夠達到並行效果。代碼如下:
#define MAX_NUMBER 1000L
#define STATUS int
#define OK 0
#define FALSE -1
typedef struct _QUEUE_DATA
{
int data[MAX_NUMBER];
int head;
int tail;
}QUEUE_DATA;
STATUS push_data(QUEUE_DATA* pQueue, int data)
{
if(NULL == pQueue)
return ERROR;
if(pQueue->head == ((pQueue->tail) + 1)% MAX_NUMBER)
return ERROR;
pQueue->data[pQueue->tail] = data;
pQueue->tail = (pQueue->tail + 1)% MAX_NUMBER;
return OK;
}
STATUS pop_data(QUEUE_DATA* pQueue, int* pData)
{
if(NULL == pQueue || NULL == pData)
return ERROR;
if(pQueue->head == pQueue->tail)
return ERROR;
*pData = pQueue->data[pQueue->head];
pQueue->head = (pQueue->head + 1)% MAX_NUMBER;
return OK;
}
小結:
- 無鎖隊列只適合兩個線程並行使用,一個壓入數據,一個彈出數據
- 無鎖隊列是沒有鎖的並行,沒有死鎖的危險
- 無鎖隊列中head和tail只有在計算結束之前的時候才能進行自增運算
