2009-10-16 56 views
1

因此,我的理解是,在ReaderWriterLock(或更具體地說ReaderWriterLockSlim)上,讀取和寫入都需要獲取互斥鎖才能獲取鎖定。我想優化鎖的讀取訪問權限,如果沒有寫入掛起,則不需要獲取鎖。 (而且我願意犧牲寫入的性能,爲讀取添加一些約束,使第一次讀取速度變慢,第二次讀取速度變快等等。如果有必要,只要絕大多數讀取速度儘可能快。 )優化的ReaderWriterLock讀取訪問

那麼,如何做到這一點,甚至更好,是否有框架或「標準」的實現可以指向我? (或者如果我誤解了它,它已經被支持了,太棒了!)

所以對於我的作品: 看來,如果有一個讀者/作者數量的計數器(由Interlocked.Increment保護) ,這足以讓讀者檢查作者數是否非零,然後才獲得鎖。 (如果獲得,則在鎖內增加)。

作家總是會增加,獲取鎖定,旋轉直到讀者數到0(願意假定讀者總是快速完成,或者甚至繞過讀者完全樂觀情景),最後遞減。 (當我們阻止時,也可以很好地拋出某種形式的優先級,或者因爲我只保護一個值,因此可能一次清除所有未決的讀寫器,但現在我會放棄這一點。)

所以..任何人看到任何相似或有建議?如果之後沒有任何東西出現,我會很樂意將最初的實現和更具體的討論結合起來。

回答

3

你所描述的是,在基本層面上,已經是讀寫器鎖定的工作方式。當閱讀器/寫入器鎖使用讀者和作者的內部數量來控制訪問時,他們不需要獲取互斥鎖(實際上,互斥量意味着讀者會互相阻止,而實際上多個併發讀者是允許 - 這就是鎖類型的全部重點!)。

所以是的,這裏有一個框架/標準實現:ReaderWriterLockSlim。我真的懷疑你可以寫一個比這更好的讀寫器鎖。無論如何 - 你確定這個鎖是你性能問題的根源嗎?

+1

謝謝格雷格,你說得對。我拉出反射器,並在獲取鎖之前使用Interlocked.CompareExchange進行檢查。乾杯! – Gene 2009-10-16 19:44:10

-2

恐怕你錯了,因爲ReaderWriterLockSlim是基於自旋鎖定的,而不是互斥體(你可以在Reflector中看到這一點)。