gpt4 book ai didi

c++ - 多线程软件的测试方法

转载 作者:可可西里 更新时间:2023-11-01 14:59:01 26 4
gpt4 key购买 nike

我有一个成熟的地理空间软件,最近重写了区域以更好地利用现代 PC 中可用的多个处理器。具体来说,显示、GUI、空间搜索和主要处理都被分割到单独的线程中。该软件有一个相当大的 GUI 自动化套件用于功能回归,还有另一个较小的用于性能回归。虽然所有自动化测试都通过了,但我不相信它们在查找与竞争条件、死锁和与多线程相关的其他问题相关的错误方面提供了足够的覆盖率。您将使用什么技术来查看是否存在此类错误?假设其中有一些可以根除,您会提倡什么技术来根除它们?

到目前为止,我正在做的是在调试器下运行的应用程序上运行 GUI 功能自动化,这样我就可以打破死锁并捕获崩溃,并计划构建边界检查器并针对它重复测试版本。我还通过 PC-Lint 对源代码进行了静态分析,希望找到潜在的死锁,但没有得到任何有值(value)的结果。

该应用程序是 C++、MFC、多文档/ View ,每个文档有多个线程。我正在使用的锁定机制基于一个包含指向 CMutex 的指针的对象,该对象在 ctor 中锁定并在 dtor 中释放。我使用此对象的局部变量来根据需要锁定各种代码位,并且我的互斥体有一个超时,如果达到超时,则会触发我的警告。我尽可能避免锁定,而是尽可能使用资源拷贝。

您还会进行哪些其他测试?

编辑:我已经在许多不同的测试和编程论坛上交叉发布了这个问题,因为我很想知道不同的思维方式和思想流派将如何处理这个问题。如果您看到它交叉发布在其他地方,我们深表歉意。我将在一周左右后提供回复的摘要链接

最佳答案

一些建议:

  • 利用 law of large numbers并且不止一次,而是多次执行被测操作。
  • 通过夸大场景对您的代码进行压力测试。例如。要测试您的互斥锁持有类,请使用受互斥锁保护的代码的场景:
    • 非常短且快速(一条指令)
    • 是耗时的(Sleep值大)
    • 包含明确的上下文切换( sleep (0))
  • 在各种不同的架构上运行测试。 (即使您的软件仅适用于 Windows,也要在具有或不具有超线程以及各种时钟速度的单核和多核处理器上对其进行测试)
  • 尝试设计您的代码,使其大部分不会暴露于多线程问题。例如。而不是访问共享数据(这需要锁定或非常精心设计的锁避免技术),让您的工作线程对数据拷贝进行操作,并使用队列与它们通信。然后你只需要测试你的队列类的线程安全
  • 在系统空闲时以及其他任务加载时运行测试(例如,我们的构建服务器经常并行运行多个构建。仅此一项就揭示了系统加载时发生的许多多线程错误。)
  • 避免断​​言超时。如果这样的断言失败,您不知道代码是否已损坏或超时是否太短。相反,使用非常慷慨的超时(只是为了确保测试最终失败)。如果您想测试某个操作是否不会超过特定时间,请测量持续时间,但不要为此使用超时。

关于c++ - 多线程软件的测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2437763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com