無鎖程式設計 lock free原理

2021-07-04 18:47:21 字數 1089 閱讀 4328

無鎖程式設計是指在不使用鎖的情況下,在多執行緒環境下實現多變數的同步。即在沒有執行緒阻塞的情況下實現同步。這樣可以避免競態、死鎖等問題。

cas是指compare-and-swap或compare-and-set

cas是乙個原子操作,用於多執行緒環境下的同步。它比較記憶體中的內容和給定的值,只有當兩者相同時(說明其未被修改),才會修改記憶體中的內容。

實現如下:

int compare_and_swap(int* reg, int oldval, int newval)

bool compare_and_swap(int

*accum, int

*dest, int newval)

else

}

返回bool值得好處是可以知道是否設定成功。

在實際環境中,使用的是:

bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)

type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)

在使用cas時,需要先獲取操作變數的值並放到oldval中,之後呼叫cas函式,直到呼叫成功。例如給變數val賦值

while(true)

在多執行緒環境中,使用lock-free的cas時,如果乙個執行緒對變數修改2次,第2次修改後的值和第1次修改前的值相同,那麼可能就會出現aba問題。以上面的例子為例:

假設有兩個執行緒p1和p2,p1執行完int oldval=val後被其他執行緒搶占。p2執行緒在此期間修改了val的值(可能多次修改),但最終val的值和修改前一樣。當p1執行緒之後執行cas函式時,並不能發現這個問題。這就是aba問題。

乙個常用的方法是新增額外的「tag」或「stamp」位來標記是指標是否被修改過。

參考:

compare-and-swap

aba problem

無鎖程式設計 大綱

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

無鎖程式設計 六 seqlock 順序鎖

用於能夠區分讀與寫的場合,並且是讀操作很多 寫操作很少,寫操作的優先權大於讀操作。seqlock 的實現思路是,用乙個遞增的整型數表示sequence。寫操作進入臨界區時,sequence 退出臨界區時,sequence再 寫操作還需要獲得乙個鎖 比如mutex 這個鎖僅用於寫寫互斥,以保證同一時間...

Linux核心無鎖程式設計

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