我在C ++中写了一个线程安全的(至少目的是)容器类。我在访问成员时锁定互斥锁,并在完成时释放。 现在,如果它确实是线程安全的,我会尝试编写一个测试用例。 比方说,我有Container容器和两个线程Thread1 Thread2。
Container container;
Thread1()
{
//Add N items to the container
}
Thread2()
{
//Add N items to the container
}
通过这种方式,N = 1000可以正常工作。
但我不确定这种回归测试是否足够。是否有一种确定性的方法来测试这样的类?
感谢。
答案 0 :(得分:7)
没有真正的方法可以将测试写入证明安全。
您只能设计它以便安全并测试您的设计是否已实施。你能做的最好是压力测试。
答案 1 :(得分:1)
我猜你写了一个通用容器,并且你要验证两个不同的线程不能同时插入项目。
如果我的假设是正确的,那么我的主张就是编写一个自定义类,重载复制构造函数,插入一个可以参数化的睡眠。
要测试容器,为自定义类创建一个实例,然后在第一个线程中插入一个长sleep
的自定义类的实例,同时启动第二个线程尝试插入一个短sleep
的自定义类的实例。如果第二次插入在第一次插入之前返回,则表示测试失败。
答案 2 :(得分:0)
这是一个合理的起点,不过我会提出一些建议:
如果您的目标是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我也会删除互斥保护只是为了看它失败一次。