無鎖程式設計 六 seqlock 順序鎖

2021-09-30 13:23:16 字數 1247 閱讀 7092

用於能夠區分讀與寫的場合,並且是讀操作很多、寫操作很少,寫操作的優先權大於讀操作。

seqlock

的實現思路是,用乙個遞增的整型數表示sequence。寫操作進入臨界區時,sequence++;退出臨界區時,sequence再++。寫操作還需要獲得乙個鎖(比如mutex),這個鎖僅用於寫寫互斥,以保證同一時間最多只有乙個正在進行的寫操作。

當sequence為奇數時,表示有寫操作正在進行,這時讀操作要進入臨界區需要等待,直到sequence變為偶數。讀操作進入臨界區時,需要記錄下當前sequence的值,等它退出臨界區的時候用記錄的sequence與當前sequence做比較,不相等則表示在讀操作進入臨界區期間發生了寫操作,這時候讀操作讀到的東西是無效的,需要返回重試。

seqlock

寫寫是必須要互斥的。但是seqlock的應用場景本身就是讀多寫少的情況,寫衝突的概率是很低的。所以這裡的寫寫互斥基本上不會有什麼效能損失。

而讀寫操作是不需要互斥的。seqlock的應用場景是寫操作優先於讀操作,對於寫操作來說,幾乎是沒有阻塞的(除非發生寫寫衝突這一小概率事件),只需要做sequence++這一附加動作。而讀操作也不需要阻塞,只是當發現讀寫衝突時需要retry。

seqlock

的乙個典型應用是時鐘的更新,系統中每1毫秒會有乙個時鐘中斷,相應的中斷處理程式會更新時鐘(寫操作)。而使用者程式可以呼叫gettimeofday之類的系統呼叫來獲取當前時間(讀操作)。在這種情況下,使用seqlock可以避免過多的gettimeofday系統呼叫把中斷處理程式給阻塞了(如果使用讀寫鎖,而不用seqlock的話就會這樣)。中斷處理程式總是優先的,而如果gettimeofday系統呼叫與之衝突了,那使用者程式多等等也無妨。

seqlock

的實現非常簡單:

寫操作進入臨界區時:

void write_seqlock(seqlock_t *sl)

寫操作退出臨界區時:

void write_sequnlock(seqlock_t *sl)

讀操作進入臨界區時:

unsigned read_seqbegin(const seqlock_t *sl)

return ret;

}讀操作嘗試退出臨界區時:

int read_seqretry(const seqlock_t *sl, unsigned start)

而讀操作一般會這樣進行:

do while (read_seqretry(&seq_lock, seq)); //

嘗試退出臨界區,存在衝突則重試

無鎖程式設計 大綱

鎖定被迫交出時間片。鎖定意味著阻塞,多個執行緒 程序 排隊獲取資源,無法充分發揮系統效能。鎖定的阻塞無法通過fd進行通知,對效能有進一步的影響 理想的伺服器模型是全域性一處阻塞統一等待訊息 一些鎖限制了必須使用執行緒的方式進行開發,而執行緒無法充分利用系統的記憶體。pthread庫在特殊情況下可能產...

無鎖程式設計 lock free原理

無鎖程式設計是指在不使用鎖的情況下,在多執行緒環境下實現多變數的同步。即在沒有執行緒阻塞的情況下實現同步。這樣可以避免競態 死鎖等問題。cas是指compare and swap或compare and set cas是乙個原子操作,用於多執行緒環境下的同步。它比較記憶體中的內容和給定的值,只有當兩...

Linux核心無鎖程式設計

多核多執行緒已經成為當下乙個時髦的話題,而無鎖程式設計更是這個時髦話題中的熱點話題。linux核心可能是當今最大最複雜的並行程式之一,為我們分析多核多執行緒提供了絕佳的範例。核心設計者已經將最新的無鎖程式設計技術帶進了2。6系統核心中,本文以2。6。10版本為藍本,帶領您領略多核多執行緒程式設計的真...