- CAS(Compare and swap,比較與交換) 是一種有名的無鎖演算法,比較與交換,先比較,發現與預期一致,說明沒有其他執行緒改動過,于是再交換,如果與預期不一致說明改動過,就再來一次,
與各類鎖相比,CAS演算法會使得程式設計變得復雜,但是其擁有優越的性能優勢,而且不會出現死鎖(沒有鎖,不會有執行緒一直阻塞),使用CAS演算法沒有鎖之間競爭帶來的開銷,也沒有執行緒間頻繁調度帶來的開銷大,擁有更優越的性能,
CAS屬于樂觀鎖思想的實作方法,當多個執行緒試圖使用CAS同時更新同一個資料時,只有一個執行緒能更新資料,而其它執行緒都操作失敗,但是失敗的執行緒并不會被阻塞,而是被告知這次競爭失敗,可以再次嘗試操作,
CAS 操作包括三個運算元 : 記憶體位置(V)、預期原值(A)和新值(B),
如果記憶體位置的值與預期原值相符,那么處理器會自動將該位置值更新為新值,否則,處理器不做任何操作,無論在哪種情況下,它都會在 CAS 指令之前回傳該位置的值,(在 CAS 的一些特殊情況下僅回傳 CAS 是否成功)CAS 簡單來理解可以認為是,我認為位置 V 存放的是 A,如果V存放的確實是A,則把B放在位置V,否則,不改變V存放的值,并且告知我位置V存放的值是多少,
//CAS演算法的c語言實作:
int compare_and_swap (int* reg, int oldval, int newval)
{
ATOMIC();
int old_reg_val = *reg;
if (old_reg_val == oldval)
*reg = newval;
END_ATOMIC();
return old_reg_val;
}
ABA問題:
CAS 設計機制就是獲取預期變數A和新值B這兩個值進行比較更新,如果在獲取預期變數A和新值B這段時間內,變數值由 A 變為 B 再變為 A,那么對于 CAS 來說是不可感知的,但實際上變數值已經發生了變化,對于這個問題的解決辦法是在每次獲取時加版本號(version),每次更新時版本號 +1,這樣當發生 ABA 問題時就通過版本號得知變數被改動過,
- 無鎖編程(lock-free),在不使用鎖的情況下實作多執行緒之間的同步,也就是在沒有執行緒被阻塞的情況下實作同步,所以也叫非阻塞同步(Non-blocking Synchronization),實作非阻塞同步的方案稱為“無鎖編程演算法”( Non-blocking algorithm),
大量執行緒導致的執行緒切換開銷、鎖和非必要的記憶體拷貝都會大大降低性能,在高并發環境下要實作高吞吐量和執行緒安全,一是用優化的鎖實作,二是lock-free的無鎖結構,無鎖編程是利用處理器的一些特殊的原子指令來避免傳統并行設計中對鎖的使用,使用無鎖編程可以避免鎖的使用引起的死鎖、鎖護送、優先級反轉等問題,CAS操作是lock-free技術的基礎,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/271407.html
標籤:其他
上一篇:模板初識
