【问题标题】:Multi-threading locks test多线程锁测试
【发布时间】:2011-07-29 00:09:57
【问题描述】:

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

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

编辑:
一些澄清:

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

在多线程中需要检查一些事情:

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

【问题讨论】:

  • “仔细”算不算一种设计模式?
  • 恐怕“仔细”并不能涵盖所有不好的情况
  • -1 表示本周“设计模式”使用最差。
  • (鉴于帖子是 +2 和 -0,我认为我们可以假设这是一个形而上学的 -1,或者反对票达到了竞争条件并且没有保存)

标签: c# multithreading design-patterns locking


【解决方案1】:

您知道问题所在,这是第一步。它(通常)是 NP 完全的......但是有一些工具:

  • helgrind

valgrind 工具包的一部分;这将能够验证最常见的同步原语的使用;你也许可以告诉它你自己的原语。

  • 英特尔并行检查器

同样,让您描述自己的原语以在使用期间进行验证。见Intel Inspector reports a data race in my spinlock implementation

更新我刚刚发现 GNU libstdc(++) 和 GNU gcc 对 Helgrind 的支持有了很大的改进,参考 4.6.x 发行说明和this page

它还链接了以下附加工具

【讨论】:

  • 抱歉有点错过了 C# 标签。那里应该没有真正的区别,但它会使应用这些工具变得更加困难
【解决方案2】:

您可能需要阅读 SyncLock 和 SyncRoot,它们用于创建有关如何锁定对象的通用模式。由于您不想锁定整个对象,因此您通常需要锁定一个 SyncRoot。

一个例子是 ArrayList 或 ICollection,它们都有一个 SyncRoot,您应该使用它来锁定集合。你可以阅读更多关于Thread Synchronization on MSDN的信息。

但通常就像 Marc 指出的那样,小心点,测试,测试,测试,然后再做一些测试!

同步锁定示例

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) 永远不要那样做!

还有一个名为 Double-checked locking 的东西,它并不特定于 .NET,您可能还想在 "Strategized Locking, Thread-safe Interface, and Scoped Locking" 上阅读这篇论文。

测试线程安全

如果您想测试线程安全,我建议您查看"Unit test for thread safety",接受的答案指向Microsoft Chess,它可以帮助您识别应用程序中的死锁。

【讨论】:

  • 它是从 C++/CLI 代码派生的 C# 代码,它在 C++ 级别具有锁......没那么简单。这就是为什么我正在寻找一种测试设计,而不是如何锁定它的设计。
  • @Yochai,所以你想让你的应用程序陷入僵局?那么您正在寻找的是关于如何验证您的应用程序不会陷入死锁的测试策略?对吗?
  • 多线程测试...线程不会死锁。公平。值被正确读取,而不是在写入中间。多线程不仅仅是死锁
  • 我认为您需要详细说明您的问题,以免造成进一步的误解。
  • 你应该解释为什么你认为lock (this) 永远不行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2010-09-30
  • 2018-06-20
  • 2018-06-16
相关资源
最近更新 更多