非阻塞 無鎖 無等待演算法的核心與區別

2021-08-27 19:34:20 字數 811 閱讀 1412

[color=blue][size=xx-large]非阻塞[/size][/color]

阻塞是作業系統層面的概念,發生阻塞的準確含義為:當前執行上下文通過呼叫作業系統的介面,使自己進入等待某一事件發生的狀態。在這種等待中,該上下文將被從作業系統的排程佇列中移除,而將不獲得任何cpu執行時間。直到等待的事件發生,才被從新納入排程。

因此,所謂非阻塞演算法是指,演算法中不存在任何位置將使當前上下文進入阻塞的狀態。

[color=blue][size=xx-large]無鎖[/size][/color]

無鎖是一種比非阻塞更強的條件,也就是說所有無鎖演算法都是非阻塞的,但是非阻塞演算法不一定是無鎖的。

無鎖演算法指的是,在不用互斥鎖的情況下解決併發執行環境的race condition。無鎖演算法與非阻塞演算法的關鍵區分在於:無鎖演算法在執行過程中,某一上下文因為任何原因無法繼續執行需要暫時擱置時,其他上下文能否繼續執行,如果可以則該演算法是無鎖演算法,否則該演算法就不是無鎖演算法,頂多只有可能是非阻塞演算法。

例如,自旋鎖(spin-lock)演算法:某一執行上下文在獲得鎖之後,其他上下文需要迴圈忙等,

就是一種非阻塞演算法但不是無鎖演算法。因為在自旋鎖演算法中,所有上下文在併發衝突時都是忙等,沒有通過呼叫作業系統的介面把自己從作業系統的排程佇列中移除。但它不是無鎖演算法,因為當獲得鎖的上下文無法繼續執行時,其他所有上下文都必須忙等而無法繼續執行。

[color=blue][size=xx-large]無等待[/size][/color]

無等待是一種比無鎖更強的條件,無等待演算法要求在無鎖演算法的定義基礎上,增加乙個條件:所有上下文的執行都必須在有限的步驟內可以完成,而不依賴於其他上下文的狀態。

非阻塞的同步 無鎖(CAS演算法)

基於鎖的同步方式,是一阻塞的執行緒間同步方式,不同執行緒在鎖競爭時,總不能避免相互等待,為了避免這個問題,就提出了非阻塞同步的方式,最簡單的一種非阻塞同步實現就是threadlocal。另一種方式就是基於比較並交換 compare and swap cas演算法的無鎖併發控制方法。cas演算法的是有...

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

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

乙個高效能無鎖非阻塞鍊錶佇列

這個是乙個用c 11標準實現的無鎖非阻塞鍊錶佇列,通過增加乙個dummy節點,解偶合煉表頭指標和尾指標。使得當只有乙個生產者和乙個消費者時,進隊和出隊都無需加鎖,進隊操作的是尾指標,出隊操作的是頭指標,互不干涉。對於多個生產者且單個消費者時,只需要對尾指標加鎖保護,而頭指標不需要加鎖。反之,對於單生...