多线程锁测试

Yoc*_*mer 7 c# multithreading design-patterns locking

我有一个使用读写锁的类.

我想看看我是否正确锁定并保护了所有方法.
是否有测试设计模式来检查锁是否设置正确?

编辑:
一些澄清:

它是从C++/CLI代码派生的C#代码,它具有C++级别的锁...不那么简单.这就是我正在寻找测试设计的原因,而不是设计如何锁定它.

多线程时需要检查一些事项:

没有死锁(最明显)
正确性(如果我在1个线程中更新它将在另一个中看到)
原子写(如果我在一个线程中写入,我将只能在写入完整值时读取)
公平性(可能是更多理论证明,如果我使用Mutex,应该是真的)

Fil*_*erg 6

您可能希望阅读SyncLock和SyncRoot,它们用于创建有关如何锁定对象的常见模式.由于您不想锁定enitre对象,因此您经常拥有一个锁定的SyncRoot.

一个例子是ArrayList或ICollection,它们都有一个SyncRoot,您应该使用它来锁定集合.您可以在MSDN上阅读有关线程同步的更多信息.

但通常它就像Marc指出的那样,小心,测试,测试,测试并做更多的测试!

SyncLock的示例

public class Person
{
    public decimal Salary { get;set; }
    public string Name { get; set; }
    public readonly object SyncRoot = new object();
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样进行锁定:

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

lock(person.SyncRoot)
{
    IncreasSalary();
}
Run Code Online (Sandbox Code Playgroud)

一个糟糕的模式lock(this) 永远不要这样做!

还有财产以后称为双重检查锁定这是不特定于.net中,您可能还需要上阅读本文"策略设定锁,线程安全接口,而且仅限锁定".

测试螺纹安全性

如果您想测试线程安全性,我建议您查看"线程安全的单元测试",Microsoft Chess接受的答案可以帮助您识别应用程序中的死锁.