无锁队列设计思路以及简要代码
生活随笔
收集整理的這篇文章主要介紹了
无锁队列设计思路以及简要代码
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 非并發(fā)的一寫一讀環(huán)形隊(duì)列
- 多讀多寫環(huán)形隊(duì)列
非并發(fā)的一寫一讀環(huán)形隊(duì)列
讀指針:
1、先判斷是否有數(shù)據(jù)
2、讀取數(shù)據(jù)
3、操作指針
寫指針:
1、先判斷空間是否足夠
2、寫入數(shù)據(jù)
3、操作指針·
所以代碼也十分簡(jiǎn)單:
那么在多線程多讀多寫的情況下,該如何設(shè)計(jì)呢?
多讀多寫環(huán)形隊(duì)列
核心問題是:
1、多個(gè)線程如何競(jìng)爭(zhēng)操作一個(gè)指針?
思路:利用CAS(compare & swap)確保只有一個(gè)線程能把指針從當(dāng)前位置指向下一個(gè)位置
2、先操作指針還是先操作數(shù)據(jù)?
- 先操作指針,有可能導(dǎo)致數(shù)據(jù)還沒讀,就被寫入方覆蓋
- 先讀/寫數(shù)據(jù),可能無法競(jìng)爭(zhēng)到指針導(dǎo)致錯(cuò)誤
- 解決方案:標(biāo)記法,已讀取得數(shù)據(jù)置為NULL,未讀數(shù)據(jù)為實(shí)際數(shù)據(jù)得指針,讀寫前先判斷標(biāo)記。
此時(shí)也會(huì)出現(xiàn)一些極端的問題:
1、CAS指令的ABA問題:兩個(gè)線程同時(shí)讀/寫同一個(gè)位置,第一個(gè)線程獲取讀/寫權(quán)限后,第二個(gè)線程掛起。
指針有可能轉(zhuǎn)一圈回到原來位置,導(dǎo)致第二個(gè)線程恢復(fù)運(yùn)行,從而第二個(gè)線程CAS成功。極端情況下會(huì)導(dǎo)致讀指針越過寫指針。
解決方案:通過一個(gè)唯一id:seq替換指針,seq為64位整數(shù),自增且永不重復(fù)。指針 = 隊(duì)列首地址 + seq % 隊(duì)列長(zhǎng)度
總結(jié)
以上是生活随笔為你收集整理的无锁队列设计思路以及简要代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《日落望江赠荀丞诗》第十四句是什么
- 下一篇: CPU Cache对于并发编程的影响