簡體   English   中英

可以鎖定(等待)免費雙向鏈表嗎?

[英]Is a lock (wait) free doubly linked list possible?

用C#標簽提出這個問題,但是如果可能的話,應該可以使用任何語言。

是否可以使用Interlocked操作實現雙向鏈表以提供無等待鎖定? 我想插入,添加和刪除,並清除,而不是等待。

是的,這是可能的,這是我在C ++中實現類似STL的無鎖雙鏈表

生成線程以在列表上隨機執行操作的示例代碼

它需要64位比較和交換才能在沒有ABA問題的情況下運行。 此列表僅可用於無鎖內存管理器

查看第12頁基准測試 隨着爭用的增加,列表的性能與線程數呈線性關系。 該算法支持不相交訪問的並行性,因此隨着列表大小的增加,爭用可能會減少。

一個簡單的谷歌搜索將揭示許多無鎖雙鏈表。

但是,它們基於原子CAS(比較和交換)。

我不知道C#中的操作是多么原子,但根據這個網站

http://www.albahari.com/threading/part4.aspx

C#操作只能保證讀取和寫入32位字段的原子性。 沒有提到CAS。

這是一篇論文 ,描述了一個無鎖雙鏈表。

我們提出了一種高效且實用的並發deque的無鎖實現,它是不相交並行可訪問的,並使用現代計算機系統中可用的原子基元。 先前已知的無鎖定的deques算法要么基於不可用的原子同步原語,要么僅實現功能的子集,要么不是為不相交的訪問而設計的。 我們的算法基於雙向鏈表,只需要單字比較和交換......

Ross Bencina有一些非常好的鏈接,我剛剛找到了關於“ 關於無鎖和無等待算法的一些注釋 ”的數字論文和源代碼示例。

我不相信這是可能的,因為你不得不一次設置多個參考,並且互鎖操作的功率有限。

例如,執行add操作 - 如果要在A和C之間插入節點B,則需要在一個原子操作中設置B-> next,B-> prev,A-> next和C-> prev。 聯鎖無法處理。 預設B的元素甚至沒有幫助,因為另一個線程可能會在您准備“B”時決定插入。

在這種情況下,我會更多地關注鎖定盡可能細粒度,而不是試圖消除它。

在大多數體系結構中,可以為所有可復制數據結構編寫無鎖算法[1]。 但是很難寫出有效的。

我寫了一篇由HåkanSundell和Philippas Tsigas為.Net編寫的無鎖雙鏈表實現 注意,由於這個概念,它不支持原子PopLeft。

[1]: Maurice Herlihy:等待自由同步的不可能性和普遍性結果(1988)

那你還沒有問過怎么做。 但是,如果您可以在c#中執行原子CAS,那么這是完全可能的。

事實上,我現在只是在C ++中實現一個雙向鏈接的等待自由列表。

這是描述它的論文。 http://www.cse.chalmers.se/~tsigas/papers/Haakan-Thesis.pdf

並且演示文稿也可能為您提供一些線索。 http://www.ida.liu.se/~chrke/courses/MULTI/slides/Lock-Free_DoublyLinkedList.pdf

閱讀腳注 - 他們計划在VS2010的最終版本之前從4.0中提取ConcurrentLinkedList

FWIW,.NET 4.0正在System.Collections.Concurrent命名空間中添加一個ConcurrentLinkedList,一個線程安全的雙向鏈表。 您可以閱讀文檔或描述它的博客文章

我會說答案是非常嚴格的“是的,這是可能的 ,但很難”。 為了實現你所要求的,你基本上需要能夠將操作編譯在一起以確保沒有沖突的東西; 因此,為此目的創建一般實施將非常困難,並且仍然會有一些重大限制。 根據精確的需求創建一個特定的實現可能會更簡單,即使這樣,它也不會“簡單”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM