環形緩衝區為什麼是lock free的

時間 2021-06-08 05:47:05

1樓:

Lock-free是一種同步方法。Circular buffer是lock-free的說法從嚴格角度是不對的,但的確lamport首先以這一資料結構提出了一種不使用鎖或者叫互斥來同步讀寫二者的方法。@有為的答案指明了這一點。

至於為什麼不滿足lock-free是因為還要看寫滿讀空的策略才能決定這一點。

2樓:net yawn

首先應該明確下概念,lock free是說還是可以用CAS之類的原子鎖的,連CAS都不用的叫wait free。

lock free的ring buffer是可以實現的,可以參考DPDK中的實現。滿足一定的假設的情況下,wait free也是可以實現的。

3樓:Xi Yang

只是可以做成lock free,不是一定lock free。

這需要CPU支援原子操作的原語,然後用一些原子操作把多個讀、寫互相排開。

按我的經驗,是可以有多個讀、寫執行緒的,不需要侷限於單讀單寫。單讀單寫甚至可以做成wait-free。

4樓:龔正

今天在PIC上開發時就用了一下這樣的環形快取。

需求是個資料採集系統。需要監聽非標準波特率(250kbps)四個UART傳來的資料報。資料報有各種格式,大小長度週期無假設。收到後解析處理再打包從SPI發出。

原來的實現由於包長度不一,不好設定長觸發DMA,又要考慮時延小,怕包尾收不滿DMA掛在那等下乙個包來撐滿。所以沒用DMA。結果就來乙個位元組產生乙個中斷處理,把資料塞入記憶體中FIFO佇列待處理。

最後CPU時間全都用在中斷呼叫壓堆疊上了,沒時間解包再傳送了。

研讀DS後將四個DMA都設定為連續接收模式,處理週期200Hz下每個DMA控制器的位址暫存器 DMAxSTA指向長度為250000/(8+1+1)/200=節的dual-ported SRAM 空間,以保證佇列不要被撐爆。

這樣,將DMAxSTA暫存器當作佇列頭部指標,由DMA控制器在接收到UART的資料後從DMA Bus寫入並向後移動指標,且超過125次接收後自動回到初始位址。就是標準的loop buff。

我這邊程式則四個程序,每個程序維護各自佇列的尾部指標,每5毫秒定時wake up,然後從CPU Bus讀光這個loop buff再解析處理。

如此就避免了大量的中斷占用CPU,處理邏輯也集合到一起便於維護。這樣針對的設計也避免用到鎖,而且連題主引用中的標誌位也不用了(因為設計上不會出現滿的狀態)。

5樓:肥仔

ring buffer的lock free(絕對無鎖)必須有三個前提,cpu支援記憶體柵欄,資料的位址必須是四對齊的,一生產者一消費者,否則是不安全的,cas是有aba問題的,所以不能考慮。

瞬變電磁法中,為什麼早期是遠區,晚期是近區?

看你一天到晚問一些非常欠缺基礎的問題,不禁讓人懷疑你是不是應該好好看看書補充一下基礎知識了,打牢固基礎才能繼續學習啊。首先場的早晚和遠近是沒有任何直接聯絡的。場的早期與晚期指的是時間維度的變化,其中早期場指的是高頻成分尚未完全衰減的場,晚期場指的是高頻成分衰減完畢只剩低頻成分的場。相對的,近場指的是...

lex為什麼是動漫區一哥?

無趣的社會 因為動漫雜談出來的粉絲最多 但我記得他不搞男團的時候2 300萬粉絲 還是個宅男結果現在900萬粉絲搞成南韓明星設計可能男團女粉好來錢吧 死宅都去買手辦了哪有錢給他 WutheringEthan 飯圈化的大環境裡,總要有乙個 巫妖王 上句裡,巫妖王不過是乙個符號而已,你把這個詞換成出頭鳥...

為什麼說vans中幫是死亡區?

Ayo在你頭上開坦克 對於板仔來說 保護性不如Hi,靈活性不如old skool但是反過來也可以說 比Hi靈活,比old skool有安全感 狗頭護體 個人還是比較喜歡低幫,別問,問就是拿命磕出來的的才叫好招 吃盼菇涼 因為中幫降低了鞋的收口位置,鞋口大,又不像低幫鞋後跟會稍微往裡收一下,鞋後跟的位...