cas的典型使用模式是:首先執行緒從記憶體v中讀取值a,當且僅當預期值a和記憶體值v相同時,將記憶體值v修改為b,否則返回v。這是一種樂觀鎖的思路,它相信在它修改v之前,沒有其他執行緒會去修改v值;而synchronized是一種悲觀鎖,它認為在它修改v之前,一定會有其它執行緒去修改v,悲觀鎖效率很低。
可以用cas在無鎖的情況下實現原子操作,但要明確應用場合,非常簡單的操作且又不想引入鎖可以考慮使用cas操作,當想要非阻塞地完成某一操作也可以考慮cas。不推薦在複雜操作中引入cas,會使程式可讀性變差,且難以測試,同時會出現aba問題。(aba問題大致是指記憶體值v從a變成b,再從b變成a,這時候cas會認為沒有發生變化。解決aba問題可以考慮增加乙個修改計數,只有修改計數不變的且v值不變的情況下才做操作,也可以考慮引入版本號,當版本號相同時才做操作等)
什麼是aba問題?
aba並不是乙個縮寫,更像是乙個形象的描述。aba問題出現在多執行緒或多程序計算環境中。
首先描述aba。假設兩個執行緒t1和t2訪問同乙個變數v,當t1訪問變數v時,讀取到v的值為a;此時執行緒t1被搶占了,t2開始執行,t2先將變數v的值從a變成了b,然後又將變數v從b變回了a;此時t1又搶占了主動權,繼續執行,它發現變數v的值還是a,以為沒有發生變化,所以就繼續執行了。這個過程中,變數v從a變為b,再由b變為a就被形象地稱為aba問題了。
上面的描述看上去並不會導致什麼問題。t1中的判斷v的值是a就不應該有問題的,無論是開始的a,還是aba後面的a,判斷的結果應該是一樣的才對。
不容易看出問題的主要還是因為:「值是一樣的」等同於「沒有發生變化」(就算被改回去了,那也是變化)的認知。畢竟在大多數程式**中,我們只需要知道值是不是一樣的,並不關心它在之前的過程中有沒有發生變化;所以,當我需要知道之前的過程中「有沒有發生變化」的時候,aba就是問題了。
比較並交換CAS
cas包含了3個運算元 需要讀寫的記憶體位置v 進行比較的值a和擬寫入的新值b。當且僅當v的值等於a時,cas才會通過原子方式用新值b來更新v的值,否則不會執行任何操作。無論位置v的值是否等於a,都將返回v原有的值。cas的含義是 我認為v的值應該為a,如果是,那麼將v的值更新為b,否則不修改並告訴...
比較並交換 CAS 原理
引用 比較並交換 cas 支援併發的第乙個處理器提供原子的測試並設定操作,通常在單位上執行這項操作。現在的處理器 包括 intel 和 sparc 處理器 使用的最通用的方法是實現名為比較並轉換或 cas 的原語。在 intel 處理器中,比較並交換通過指令的 cmpxchg 系列實現。powerp...
比較電路交換和分組交換。
問題1.要傳送的報文共x bit 從源點到終點共經過k段鏈路,每段鏈路的傳播時延為d s 資料率為b bit s 在電路交換式電路的建立時間為s s 在分組交換時分組長度為p bit 且各節點的排隊等待時間可忽略不及。問在怎樣的條件下,分組交換的時延比電路交換的要小?答 對電路交換,當t s時,鏈路...