關於CAS無鎖操作

2021-08-10 05:13:34 字數 894 閱讀 5798

首先先從鎖開始說起,鎖在作業系統中是很重要的一部分,它可以保證程式在多執行緒的環境下安全進行,它通過對乙個執行緒進行加鎖,當乙個執行緒加鎖之後,其餘的執行緒都要先掛起,放到後備佇列裡,直到這個程序釋放鎖之後,這也就是常說的悲觀鎖;還有一種鎖叫樂觀鎖,顧名思義,它是通過另外一種方式來實現這種互斥而不是通過鎖。

它每次不加鎖而是假設沒有衝突而去完成某項操作,如果因為衝突失敗就重試,直到成功為止。簡單的說就是進來的時候判斷一下我期待的值是不是和記憶體中的一樣,若一樣,那麼我就對這個值進行修改。否則就認為失敗。

用**簡單的表述一下我的意思吧

bool compare_and_swap(int *mem,int oldval,int newval)

return false; }

**比較簡單也比較好理解,當然在這裡我們也會用

volatile,它要保證資源記憶體對所有的執行緒都是可見的。

說一說為什麼要這

麼用吧,因為在大型的執行緒中使用鎖是合情合理的,但在很小的執行緒中,你要是再用鎖那就是得不償失了,就像是++操作,鎖操作就會使得效率低下,而且加鎖之後的優先順序問題也會引起一些問題,這都是我們不想要的。所以就會有cas這種操作。

但是,cas操作也不是萬無一失的,比如說:a要取v這個記憶體的資源,b也要取v這個資源的記憶體,那麼就有可能還有這樣一種情況:b取完之後,把v的資料改完之後又回成了原來的值,這個時候a剛好取到v,一看,哎,沒有變,那麼我就修改這個記憶體的值繼續執行。我個人理解這就是對記憶體的重寫,這會引起執行緒不安全。

那麼,為了解決這個問題,我們引入了double -cas,也就是說又加了一層保險,如在32位機器上檢查64位的內容,前一部分還是我們原來的指標,但後面就是我們的計數字,當我們判斷是否相同的時候,若只是前面指標相同,而後面的計數字不同,還是會判斷為不同。這樣的話就會更加保險一點。

CAS無鎖演算法

cas即compare and swap.cas的語義 我認為v的值應該為a,如果是,那麼將v的值改為b,否則不修改並告訴v的值實際為多少 記憶體值v,舊的預期值a,要修改的值b 是一種解決鎖機制帶來的問題方案.例如有個int i 5,兩個執行緒都將對i進行 i 操作 如圖中紅色和綠色兩個執行緒 當...

CAS無鎖機制

1 與鎖相比,使用比較交換 下文簡稱cas 會使程式看起來更加複雜一些。但由於其非阻塞性,它對死鎖問題天生免疫,並且,執行緒間的相互影響也遠遠比基於鎖的方式要小。更為重要的是,使用無鎖的方式完全沒有鎖競爭帶來的系統開銷,也沒有執行緒間頻繁排程帶來的開銷,因此,它要比基於鎖的方式擁有更優越的效能。2 ...

樂觀鎖與悲觀鎖 及CAS無鎖演算法

樂觀鎖與悲觀鎖 獨佔鎖是一種悲觀鎖,synchronized就是一種獨佔鎖,它假設壞的情況,並且只有在確保其它執行緒不會造成干擾 的情況下執行,會導致其它所有需要鎖的執行緒掛起,等待持有鎖的執行緒釋放鎖。而另乙個更加有效的鎖就 是樂觀 鎖。所謂樂觀鎖就是,每次不加鎖而是假設沒有衝突而去完成某項操作,...