Yoc*_*mer 7 c# multithreading design-patterns locking
我有一个使用读写锁的类.
我想看看我是否正确锁定并保护了所有方法.
是否有测试设计模式来检查锁是否设置正确?
编辑:
一些澄清:
它是从C++/CLI代码派生的C#代码,它具有C++级别的锁...不那么简单.这就是我正在寻找测试设计的原因,而不是设计如何锁定它.
多线程时需要检查一些事项:
没有死锁(最明显)
正确性(如果我在1个线程中更新它将在另一个中看到)
原子写(如果我在一个线程中写入,我将只能在写入完整值时读取)
公平性(可能是更多理论证明,如果我使用Mutex,应该是真的)
您可能希望阅读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接受的答案可以帮助您识别应用程序中的死锁.
| 归档时间: |
|
| 查看次数: |
1983 次 |
| 最近记录: |