我正在围绕Dictionary编写一个薄的包装器,它被设计为线程安全的.因此,需要一些锁定,并且大多数逻辑都是确保正确锁定事物并以线程安全的方式访问.
现在,我正在尝试进行单元测试.我想要进行单元测试的一件大事就是锁定行为,以确保它是正确的.但是,我从未在任何地方看到过这种情况,所以我不确定如何去做.另外,我知道我可以使用一堆线程将内容扔到墙上,但是通过这种类型的测试,无法保证它在错误时会失败.这取决于操作系统定义的线程调度行为.
有哪些方法可以确保我的锁定行为在单元测试中是正确的?
利用TDD驱逐线程安全代码的好方法是什么?例如,假设我有一个工厂方法,它使用延迟初始化来创建一个类的一个实例,然后返回它:
private TextLineEncoder textLineEncoder;
...
public ProtocolEncoder getEncoder() throws Exception {
if(textLineEncoder == null)
textLineEncoder = new TextLineEncoder();
return textLineEncoder;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想以良好的TDD方式编写测试,迫使我使这段代码成为线程安全的.具体来说,当两个线程同时调用此方法时,我不想创建两个实例并丢弃一个实例.这很容易做到,但我怎样才能编写一个让我这样做的测试?
我在Java中问这个问题,但答案应该更广泛适用.
在我正在进行的项目中,我们正在进行一项未知数量的闪烁测试,这些测试以不同的速率失败(从每隔一次运行到每5000次运行一次),这使我们相信我们有一些严肃的Heisenbugs需要解决.大多数情况下,包括代码中的跟踪语句会改变时间,足以消除这些错误,或者至少使它们不经常发生,但显然这不是一个有效的错误修复.
我们想知道是否有任何工具similair到CHESS(http://research.microsoft.com/en-us/projects/chess/download.aspx)在Visual Studio 2010中工作以压力测试应用程序并检测潜在的竞争条件和僵局?
我有一个使用读写锁的类.
我想看看我是否正确锁定并保护了所有方法.
是否有测试设计模式来检查锁是否设置正确?
编辑:
一些澄清:
它是从C++/CLI代码派生的C#代码,它具有C++级别的锁...不那么简单.这就是我正在寻找测试设计的原因,而不是设计如何锁定它.
多线程时需要检查一些事项:
没有死锁(最明显)
正确性(如果我在1个线程中更新它将在另一个中看到)
原子写(如果我在一个线程中写入,我将只能在写入完整值时读取)
公平性(可能是更多理论证明,如果我使用Mutex,应该是真的)