KFIFO無鎖佇列

2021-07-12 00:57:16 字數 614 閱讀 1000

linux核心中實現了以非常漂亮的無鎖佇列,在只有乙個讀者和乙個寫者的情況下,無需上鎖,而擁有執行緒安全的特性,使得效能相比於加鎖方式實現的佇列提公升數倍

kfifo的分析可見

這位作者講的很清楚

kifio可以實現無鎖佇列,但是為什麼可以實現呢,通過這種方式為什麼可以執行緒安全?換句話說,平時實現的為什麼會產生問題?

linux核心實現中有幾個trick

1、sbuffer ize設定為2的n次冪

2、使用&(szie-1)代替求餘

3、使用整數自動溢位構成的乙個環替代迴圈陣列,最大的好處是判斷滿和空簡單多了

4、先操作後計數的方法

回到問題?直接實現的佇列為什麼沒有執行緒安全特性

造成資料混亂自然是多執行緒同時修改讀指標和寫指標造成,最重要的一點是先修改指標然後讀取資料,如果修改完指標以後,執行緒被切換,而此時卻沒有成功的把資料複製過去或者沒有複製完整,那麼剛好取得當前不成功存入的或還沒有存入的資料,那麼就造成了執行緒不安全

而kfifo中,那麼多的trick,我認為能夠產出執行緒安全的乙個就是調換改變指標和輸入\輸出資料的順序。

在輸入\輸出指標沒有真正改變之前,始終無法真正的讀取到當前的值,而一旦指標改變。那麼讀取也就安全了。

mySQL無鎖佇列 go 無鎖佇列

無鎖佇列適用場景 兩個執行緒之間的互動資料,乙個執行緒生產資料,另外乙個執行緒消費資料,效率高 缺點 需要使用固定分配的空間,不能動態增加 減少長度,存在空間浪費和無法擴充套件空間問題 package main import fmt reflect strings time type loopque...

無鎖環形佇列

環形一讀一寫佇列中,不需要擔心unsigned long溢位問題,因為溢位後自動回歸,相減值還會保留。示例一 注 max count 必須為 2 的指數,即 2,4,8,16.佇列尺寸 define max count 4096 define max mask 4095 max count 1 變數...

環形無鎖佇列

1 元素是先進先出的 由佇列的性質保證的,在環形佇列中通過對佇列的順序訪問保證 2 空間可以重複利用 因為一般的環形佇列都是乙個元素數固定的乙個閉環,可以在環形佇列初始化的時候分配好確定的記憶體空間,當進隊或出隊時只需要返回指定元素記憶體空間的位址即可,這些記憶體空間可以重複利用,避免頻繁記憶體分配...