關於無鎖隊列的概念與實現,可以參考博文《無鎖隊列的實現》,主要涉及到的知識點包括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只有在計算結束之前的時候才能進行自增運算