[英]Is a lock (wait) free doubly linked list possible?
用C#標簽提出這個問題,但是如果可能的話,應該可以使用任何語言。
是否可以使用Interlocked操作實現雙向鏈表以提供無等待鎖定? 我想插入,添加和刪除,並清除,而不是等待。
一個簡單的谷歌搜索將揭示許多無鎖雙鏈表。
但是,它們基於原子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。
那你還沒有問過怎么做。 但是,如果您可以在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
我會說答案是非常嚴格的“是的,這是可能的 ,但很難”。 為了實現你所要求的,你基本上需要能夠將操作編譯在一起以確保沒有沖突的東西; 因此,為此目的創建一般實施將非常困難,並且仍然會有一些重大限制。 根據精確的需求創建一個特定的實現可能會更簡單,即使這樣,它也不會“簡單”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.