2011-04-04 66 views
7

我有一個使用讀寫鎖的類。多線程鎖測試

我想看看我是否正確鎖定並保護了所有方法。
有沒有測試設計模式來檢查鎖是否設置正確?

編輯:
一些澄清:

這是從C++/CLI代碼衍生的C#代碼,具有鎖在C++級......沒那麼簡單。這就是爲什麼我正在尋找一個測試設計,而不是設計如何鎖定它。

有需要被檢查,同時多線程的幾件事情:

無死鎖(最明顯的)
正確性(如果我在1個線程更新它,它會在其他看出)
原子寫(如果我在一個線程中寫的,我將能夠讀取只有當滿值寫入)
公平(可能是更多的理論來證明,如果我使用互斥反正應該是真實的)

+8

是否將「小心」算作設計模式? – 2011-04-04 08:17:53

+2

恐怕「謹慎」不會涵蓋所有糟糕的情況 – 2011-04-04 08:18:45

+0

-1,因爲本週最糟糕的設計模式。 – sehe 2011-04-04 08:27:05

回答

6

您可能需要閱讀使用SyncLock和SyncRoot來創建關於如何l的通用模式ock你的對象。既然你不想鎖定一個enitre對象,你通常會有一個你鎖定的SyncRoot。

爲此的一個示例是ArrayList或ICollection,它們都具有您應該用於鎖定集合的SyncRoot。你可以閱讀更多關於Thread Synchronization on MSDN

但通常就像Marc指出的那樣,要小心,測試,測試,測試並做一些更多的測試!爲SyncLock

public class Person 
{ 
    public decimal Salary { get;set; } 
    public string Name { get; set; } 
    public readonly object SyncRoot = new object(); 
} 

實例然後,您可以接近鎖定這樣的:

var person = new Person { Name = "Bill", Salary = 1000000 }; 

lock(person.SyncRoot) 
{ 
    IncreasSalary(); 
} 

一個bad pattern是做lock(this)NEVER做到這一點!

還有一些叫做Double-checked locking的東西,它不是特定於.NET的,您可能還想閱讀"Strategized Locking, Thread-safe Interface, and Scoped Locking"上的這篇論文。

測試線程安全

如果你想測試線程安全的,我建議你看看"Unit test for thread safety",公認的答案指向Microsoft Chess它可以幫助您確定您的應用程序死鎖。

+0

這是一個從C++ /在C++級別鎖定的CLI代碼...並不那麼簡單。這就是爲什麼我正在尋找一個測試設計,而不是設計如何鎖定它。 – 2011-04-04 08:30:55

+0

@Yochai,所以你想強調你的應用程序陷入僵局?那麼你在尋找的是如何驗證你的應用程序不會陷入僵局的測試策略?那是對的嗎? – 2011-04-04 08:32:21

+0

多線程測試...線程不會死鎖。公平。值得到正確讀取,而不是在寫入中。還有更多的多線程比死鎖 – 2011-04-04 08:36:30

2

你知道這個問題,那是第一步。它(通常)是NP-complete ...然而,有一些工具:

  • helgrind的Valgrind的工具包的

一部分;這將能夠驗證最常用的同步原語的使用;你可能能夠告訴它關於你自己的基元。

  • 英特爾Parallel Inspector中

同樣讓你在使用過程中形容自己的圖元進行驗證。見Intel Inspector reports a data race in my spinlock implementation

更新我剛剛發現GNU的libstdc(++)和GNU GCC極大地改善了他們的支持Helgrind的,指的是4.6.X的發行說明和this page

網站還鏈接了以下附加工具

+0

Sry有點錯過了C#標籤。這裏應該沒有真正的區別,但這會使應用這些工具變得更加困難 – sehe 2011-04-04 08:33:42