C++ 多线程软件的测试方法
我有一个成熟的地理空间软件,最近对这些区域进行了重写,以更好地利用现代PC机中可用的多处理器。具体而言,显示器、GUI、空间搜索和主处理都被划分为单独的线程。该软件有一个相当大的GUI自动化套件用于功能回归,另一个较小的GUI自动化套件用于性能回归。虽然所有的自动化测试都通过了,但我不相信它们在查找与竞争条件、死锁和其他与多线程相关的问题相关的bug方面提供了足够的覆盖率。您将使用什么技术来查看是否存在此类错误?假设有一些方法可以根除,你会提倡什么方法来根除它们 到目前为止,我所做的是在调试器下运行的应用程序上运行GUI功能自动化,这样我就可以打破死锁并捕获崩溃,并计划生成边界检查器,并针对该版本重复测试。我还通过PC Lint对源代码进行了静态分析,希望找到潜在的死锁,但没有得到任何有价值的结果C++ 多线程软件的测试方法,c++,multithreading,testing,mfc,C++,Multithreading,Testing,Mfc,我有一个成熟的地理空间软件,最近对这些区域进行了重写,以更好地利用现代PC机中可用的多处理器。具体而言,显示器、GUI、空间搜索和主处理都被划分为单独的线程。该软件有一个相当大的GUI自动化套件用于功能回归,另一个较小的GUI自动化套件用于性能回归。虽然所有的自动化测试都通过了,但我不相信它们在查找与竞争条件、死锁和其他与多线程相关的问题相关的bug方面提供了足够的覆盖率。您将使用什么技术来查看是否存在此类错误?假设有一些方法可以根除,你会提倡什么方法来根除它们 到目前为止,我所做的是在调试器下
应用程序是C++、MFC、多文档/视图,每个DOC具有多个线程。我使用的锁定机制基于一个对象,该对象包含一个指向CMutex的指针,该指针在ctor中被锁定,在dtor中被释放。我使用这个对象的局部变量来根据需要锁定不同的代码位,我的互斥锁有一个超时,如果达到超时,就会发出警告。我尽量避免锁定,尽量使用资源副本
您还将进行哪些其他测试 编辑:我已经在许多不同的测试和编程论坛上交叉发布了这个问题,因为我渴望看到不同的思维方式和思想流派如何处理这个问题。所以,如果你看到它在别处交叉张贴,我表示歉意。大约一周后,我将提供一个摘要链接,链接到回应并非真正的答案: 测试多线程bug非常困难。大多数bug只有在两个(或更多)线程以特定顺序进入代码中的特定位置时才会出现。 是否以及何时满足此条件可能取决于进程运行的时间。此正时可能会因以下前提条件之一而改变:- 处理器类型
- 处理器速度
- 处理器/核心数
- 优化水平
- 在调试器内部或外部运行
- 操作系统
- 从内存读取refcount到寄存器
- 递增/递减寄存器
- 将refcount从寄存器写入内存
- 线程A:从内存读取refcount到寄存器(refcount:8)
- 线程A:增量寄存器
- 语境变化-
- 线程B:从内存读取refcount到寄存器(refcount:8)
- 线程B:增量寄存器
- 线程B:将引用计数从寄存器写入内存(引用计数:9)
- 语境变化-
- 线程A:将引用计数从寄存器写入内存(引用计数:9)
它将在几天、几周或几个月内发生 虽然我同意@rstevens的回答,目前没有办法100%确定地对线程问题进行单元测试,但我发现有些东西很有用 首先,不管你做了什么测试,都要确保你在很多不同的规格盒上运行它们。我有几个构建机器,都是不同的,多核的,单核的,快的,慢的,等等。它们的多样性的好处是不同的机器会产生不同的线程问题。我经常去苏尔
class A {
private:
int refcount;
public:
A() : refcount(0) {
}
void Ref() {
refcount++;
}
void Release() {
refcount--;
if (refcount == 0) {
delete this;
}
}
};