多線程之無鎖隊(duì)列

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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java平臺(tái)類庫包含了豐富的并發(fā)基礎(chǔ)構(gòu)建模塊,例如線程安全的容器類以及各種用于協(xié)調(diào)多個(gè)相互協(xié)作的線程控制流的同步工...
    Steven1997閱讀 606評(píng)論 0 0
  • Java-Review-Note——4.多線程 標(biāo)簽: JavaStudy PS:本來是分開三篇的,后來想想還是整...
    coder_pig閱讀 1,772評(píng)論 2 17
  • Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時(shí)執(zhí)行代碼、方法又是什么? 1...
    AlanGe閱讀 1,919評(píng)論 0 17
  • Q:為什么出現(xiàn)多線程? A:為了實(shí)現(xiàn)同時(shí)干多件事的需求(并發(fā)),同時(shí)進(jìn)行著下載和頁面UI刷新。對(duì)于處理器,為每個(gè)線...
    幸福相依閱讀 1,721評(píng)論 0 2
  • 曾在宿舍樓里低質(zhì)量的電梯里蹦過 被困住了 雖然被救出去了 但是坐電梯的時(shí)候 偶爾會(huì)想 會(huì)不會(huì)在我走出電梯的一剎那 ...
    九了九了九閱讀 228評(píng)論 0 0

友情鏈接更多精彩內(nèi)容