2010-05-05 296 views
8

我有一個大的樹結構,其中幾個線程同時工作。理想情況下,我希望爲每個單元格創建一個單獨的互斥鎖。使用許多互斥鎖

我看了pthread_mutex_t的定義bits/pthreadtypes.h它很短,所以內存使用不應該是我的情況的問題。

然而,沒有任何性能損失使用許多時(比方說,一個幾千)不同pthread_mutex_t本只是8個線程?

+0

上一棵樹幾千是..那種懷疑..但硬而不實際看到它說。你能發佈足夠的代碼來展示你在做什麼的合理全面的例子嗎? – 2010-05-05 15:38:15

回答

8

如果您鎖定和非常頻繁解鎖,可以有一個點球,因爲獲取和釋放鎖確實需要一定的時間,如果鎖爭用的過程可能會相當多。

當使用這樣的結構,許多鎖,你必須是非常具體的關於每個實際上鎖定鎖,並確保你小心AB-BA死鎖。例如,如果在鎖定操作期間更改樹的結構,則需要以一致的順序鎖定將要更改的所有節點,並確保處理後代的線程不會感到困惑。

如果你有大量的鎖,橫跨內存散開,緩存問題可能會導致性能問題,根據不同的體系結構,鎖定操作通常會失效,至少一些緩存的一部分。

您最好的選擇可能是實現一個簡單的鎖定結構,然後點擊個人資料,然後提煉它來提高性能,如果需要的話。我不確定你在樹上做了什麼,但是如果你期望閱讀比你更新更多的東西,那麼開始的好地方可能是整個樹的單個讀寫器鎖。

「我們應該忘記小效率,大約97%的時間:過早優化是萬惡之源。」 - Donald Knuth

+1

+1 - 很好的答案。 – 2010-05-05 15:36:11

0

您的鎖定/訪問模式需要說明,以便正確評估這一點。如果每個線程一次只能保存一個或幾個鎖,並且任何兩個或更多線程同時希望同一個鎖的概率很低(隨機訪問模式或在循環軌道上的不同位置上的8個運行器以大致相同的速度運行或其他更復雜的事情),那麼你將主要避免線程必須睡眠以獲得鎖定的最壞情況(或者在某些情況下必須讓操作系統參與決定誰獲勝),因爲你有很少線程和很多鎖。

如果每個線程在任何時候都可能需要數百或數千個鎖,那麼事情就會開始發生變化。

我不會接觸死鎖,因爲我對您使用的容器一無所知,但您需要注意避免它們的必要性。