如何编写测试用例以确保线程安全

时间:2010-07-15 10:19:01

标签: c++ c multithreading

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

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

通过这种方式,N = 1000可以正常工作。

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

感谢。

4 个答案:

答案 0 :(得分:7)

没有真正的方法可以将测试写入证明安全。

您只能设计它以便安全并测试您的设计是否已实施。你能做的最好是压力测试。

答案 1 :(得分:1)

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

如果我的假设是正确的,那么我的主张就是编写一个自定义类,重载复制构造函数,插入一个可以参数化的睡眠。

要测试容器,为自定义类创建一个实例,然后在第一个线程中插入一个长sleep的自定义类的实例,同时启动第二个线程尝试插入一个短sleep的自定义类的实例。如果第二次插入在第一次插入之前返回,则表示测试失败。

答案 2 :(得分:0)

这是一个合理的起点,不过我会提出一些建议:

  1. 在四核计算机上运行测试,以提高实际资源争用的几率。
  2. 我建议生成一个随机数量的线程,其下限等于测试机器上的处理器数量,而上限是该数字的四倍。
  3. 考虑偶尔使用大量项目(比如100,000)。
  4. 在优化的,发布(非调试)版本上运行测试。
  5. 如果您的目标是Windows,您可能需要考虑使用关键部分而不是互斥锁,因为它们通常性能更高。

答案 3 :(得分: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我也会删除互斥保护只是为了看它失败一次。