在自动化测试后安全地清理阻塞的std :: thread

时间:2015-10-20 02:34:46

标签: c++ multithreading c++14

考虑一些Mutex类实现的测试用例。该测试在执行期间创建了几个std :: thread实例。如果根据测试正确实现Mutex类,则应完成所有线程。如果出现问题,一个线程可能无限期阻塞。如何在测试之后正确清理测试?

起初我想分离线程,但随后线程被泄露了。更糟糕的是,该线程依赖于测试用例内部的Mutex实例,该实例在测试用例返回后偶尔会导致访问冲突。 Qt的QThread中的一些线程库有terminate()方法,但是我想使用std :: thread,即使Qt已经是我项目的依赖项。

是否存在可能无限期阻止并发代码的测试的一般模式?

2 个答案:

答案 0 :(得分:0)

杀死可能持有锁的线程是强行终止线程的主要原因之一,以及为什么C ++ 11不支持它。你不应该这样做,期间。

如果你需要做类似的事情,最好的方法可能是产生一个新的过程来运行测试;如果它锁定,您可以在没有相同风险的情况下终止该过程。

有关终止线程为什么是坏消息的示例,请查看specific example from the Old New Thing on what sort of garbage thread termination leaves lying around on Windows;大多数操作系统在不同的环境下都会出现类似的问题。

答案 1 :(得分:-2)

我认为析构函数可以在这里提供帮助,是唯一可以100%确定在任何问题之后执行的设计。我建议在一些析构函数中进行一个很好的阻塞测试,并在离开之前以安全方式释放资源(智能指针?)。