繁体   English   中英

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

[英]How to write a test case for ensuring thread-safe

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

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

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

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

谢谢。

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

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

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

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

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

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

  1. 在四核计算机上运行测试以提高实际资源争用的几率。
  2. 我不建议使用固定数量的线程,而是建议产生一个随机数量的线程,其下限等于测试机器上的处理器数量,上限是该数字的四倍。
  3. 考虑偶尔运行大量项目(比如100,000)。
  4. 在优化的发布(非调试)版本上运行测试。

如果您的目标是Windows,您可能需要考虑使用关键部分而不是互斥锁,因为它们通常性能更高。

证明它是安全的是不可能的,但是为了提高查找错误的压力测试机会,你可以修改容器的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我也会删除互斥保护只是为了看它失败一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM