2011-07-14 104 views
3

有人可以推薦關於如何編寫線程安全容器的好書嗎?
謝謝寫入線程安全容器

+0

您可以從'java.util.concurrent'容器中獲得靈感...... – fredoverflow

+1

來吧夥計們不要關閉它,它是一個完全有效的問題 –

+1

+1來補償downvote,它是一個有效的Q,如果作爲副本關閉,應該在評論中這樣說。 –

回答

0

STL port是一個提供線程安全性的STL實現,您可能需要檢查它。

1

1024cores.net充滿了關於編寫線程安全代碼的好文章。

1

嘗試尋找材料lock-free data structuresnon-blocking algorithms。 (Another article

知道關鍵段等是很常見的事情,但是當有多個讀取操作和很少的寫入操作時,無鎖併發方法就能很好地工作。

這種算法與重要概念(例如重入和異常安全)有許多共同點。

從更廣泛的角度講,線程安全與數據依賴關係以及所有權模型有很大關係。其結果是,如果線程安全的程序在其他方面設計得很好,則它們相對容易編寫。恕我直言,一個好的設計支付股息的整體方法 - 首先得到您的數據,之後,代碼來輕鬆。

3

線程安全容器是沒有銀子彈

E.g.這個代碼是不是線程安全的,無論您使用的容器:

if (!container.has(value)) container.add(value); 

也不是:

container[value] = container[value] + 42; 

代碼可以線程安全的,但它需要大量的多線程安全的容器。

更糟糕的是:線程安全的容器不會給你買太多東西。他們可能會幫助您在教科書中找到的簡單案例,但在實踐中存在的更復雜的案例中,無論如何您都需要鎖定(參見上面的典型案例)。在這種情況下使用線程安全的容器將純粹是頭頂上的。

看看Java,因爲它從線程安全的容器開始。幾年後,Java切換到線程不安全的容器,並棄用舊的,線程安全的容器。

所以我的建議:不要尋找線程安全的容器。相反,找一本好書如何編寫線程安全代碼

UPDATE澄清:我正在談論標準容器,如矢量,地圖和字符串。

+1

我同意這不是銀彈,但可以在沒有巨大的業績壓力的情況下完成一些簡單的任務。你也可以用一個好的API去掉一些外部鎖定,例如你可以用addIfNotExist()和addValue()方法擴展容器的接口。對於你需要鎖定的隊列來檢查隊列是否爲空,如果沒有彈出一個值,你可以編寫一個popBlocking(),它將在隊列不爲空時等待,或者寫一個popIfExists(),它將返回一些指定的值如果隊列爲空(例如:如果存儲指針,則爲NULL) –

+0

@yi_H事實上,良好的API設計非常重要,但惡魔在細節中,這些細節取決於需求。因此,恕我直言,你最終爲你的應用程序設計了一些線程安全的API(無論如何使用非線程安全的容器)。我同意通常以一個addIfNotExist()或addValue()結尾,用另一個名字僞裝。然而,我的觀點是,實現一個標準容器的API的線程安全版本(例如矢量,地圖,字符串)沒有多大幫助。 – Sjoerd

+0

@yi_H E.g. addValue()在計算興趣時沒有多大幫助,因此我們在泛型API中添加multiplyBy()?但是如果正面和負面的賬戶有不同的利率呢?等等。 – Sjoerd