2010-07-15 53 views
2

我在C++中编写了一个线程安全的(至少目标是这样的)容器类。我在访问成员时锁定互斥体,并在完成时释放。 现在,我试着编写一个测试用例,如果它真的是线程安全的。 比方说,我有Container容器和两个线程Thread1 Thread2。如何编写测试用例以确保线程安全

Container container; 
Thread1() 
{ 
    //Add N items to the container 
} 
Thread2() 
{ 
    //Add N items to the container 
} 

以这种方式,它在N = 1000时没有问题。

但我不确定这个回归测试是否足够。有没有一种确定的方法来测试这样的类?

谢谢。

回答

7

有没有真正的方法来编写测试证明其安全。

您只能设计它,所以它是安全的,并测试您的设计是否实现。最好你能做的就是压力测试。

0

这是一个合理的出发点,但我想提出几点建议:四核机器上

  1. 运行测试,以提高真正的资源争用的可能性。
  2. 我不建议使用固定数量的线程,而是建议随机数量的线程,其下限等于测试机器上的处理器数量,上限是该数字的四倍。
  3. 考虑偶尔使用大量项目(比如说100,000)。
  4. 在优化版本(非调试版本)上运行测试。

如果您的目标是Windows,您可能需要考虑使用临界区域而不是互斥体,因为它们通常性能更高。

0

证明它的安全是不可能的,但对于提高发现错误的压力测试的机会,你可以修改容器的add方法,以便看起来是这样的:

// Assuming all this is thread safe 
if (in_use_flag == true) { 
    error! 
} 
in_use_flag = true; 

... original add method code .... 

sleep(long_time); 
in-use-flag = false; 

这样,你几乎可以确保两个线程同时尝试访问容器,并检查这种情况 - 从而确保线程安全性实际工作。

PS我也会删除互斥保护,看看它一次失败。

1

我想你写了一个通用的容器,并且你想验证两个不同的线程不能在同一时间插入项目。

如果我的假设是正确的,那么我的建议是编写一个自定义类,让你重载拷贝构造函数,插入一个可以被参数化的睡眠。

要测试您的容器,请为您的自定义类创建一个实例,然后在第一个线程中插入自定义类的实例,并使用长sleep,同时启动第二个线程以尝试插入实例自定义类与一个简短的sleep。如果第二次插入在第一次插入之前回来,您知道测试失败。

+0

捕捉一些竞争条件的好方法,但它也可能隐藏其他人。有没有保证的方式来验证没有竞争条件,写几个测试,而@Grimmy建议应该肯定是其中之一。 – jalf 2010-07-15 10:45:09