2009-04-26 31 views
3

Windows提供了一個無鎖單鏈表,因爲在本頁面記載: Win32 SListWin32的無鎖SList在那裏有一個體面的C++包裝嗎?

我不知道是否有解決此功能的現有良好的C++包裝。當我說好時,我的意思是儘可能導出通常的STL接口,支持迭代器等。我寧願使用別人的實現,而不願坐下來寫一個STL類型的容器。

+0

爲什麼要麻煩?純C++實現的開銷會更少,並且可能會有大量代碼... – Shog9 2009-04-26 16:22:47

+1

因爲它是* lockless *線程安全的容器。 – Promit 2009-04-26 16:46:46

回答

1

你可以快速啓動並運行boost :: boost :: iterator_facade。

不,它不會是最佳的或可移植的,迭代器語義是你應該聽到的東西Alexandrescou突然出現在DevCon。您沒有鎖定容器,您正在鎖定(並可能重新鎖定和解鎖)操作。而鎖定操作意味着串行執行,非常簡單。有很多迭代器操作會對創建的抽象進行不必要的懲罰。

從Mars的角度來看,迭代器隱藏了指針,隱藏在一個半OO概念之下,與OO-vs-Distributed開發是不同的。我肯定會使用一個'procedural'接口,用戶/維護人員注意爲什麼這是必要的。無鎖操作只與圍繞它的「所有並行代碼」一樣好。自96年起,人們不斷給scoped_lock打包重新創建經典示例,它會生成相當多的序列代碼。

或者使用原子和Sutter的DDJ條目作爲窮人前進的方向(以及超過10年的Pentium Pro之後的無序)。 (真正發生的一切就是增強和DDJ運行後.net和MS CCR列車運行後,不變性,以及英特爾列車運行後,一個良好的類似OO的無鎖開發抽象。問題在於它不能很好地完成,有些人一次又一次地去對抗,就像TBB的concurrent_vector廢話一樣,異常也沒有成爲無問題的東西,尤其是在不同的環境中,以及爲什麼CPU中的矢量處理沒有被C++編譯器等使用...)

-1

我覺得一個薄包裝應該很容易寫。如1-2頁,可能全部在.h文件中。而不是梳理谷歌,我已經自己寫了。

3

值得注意的是,在問題引用的頁面上發佈的接口實際上並沒有實現鏈表(儘管這可能是底層結構) - 它實現了一個堆棧。所以如果你想要一個像std :: list這樣的類提供的鏈表的功能,這可能不適合你。

還注意到堆棧不能支持迭代器(它們基本上只支持push和pop),所以支持迭代器和算法的討論很多都是一廂情願的想法。

5

你將無法在SList上層疊STL樣式界面。爲了避免內存管理問題,列表中唯一可訪問的節點是列表的頭部。訪問該節點的唯一方法是將其從列表中彈出。這可以防止兩個線程擁有相同的節點,然後一個線程刪除該節點,而另一個線程仍在使用它。這就是我所說的「內存管理問題」,是無鎖編程中常見的問題。你總是可以彈出第一個節點,然後按照SLIST_ENTRY結構中的「下一步」指針進行操作,但這是一個非常糟糕的主意,除非你可以保證列表不會被縮小,並且在讀取節點時會釋放節點。當然,這仍然會從列表中刪除頭節點。

基本上你試圖使用SList錯誤。對於你想要做的事情,你只需要使用STL容器並使用鎖來保護對它的訪問。 STL算法不適用於像SList那樣可變的無鎖數據結構。

所有的說法你可以創建一個圍繞SList的C++包裝,但它不會STL兼容。