如何测试应用程序的线程安全性?

Posted

技术标签:

【中文标题】如何测试应用程序的线程安全性?【英文标题】:How can I test an application for thread safety? 【发布时间】:2020-05-14 10:12:57 【问题描述】:

我有一个工作的 C++ 应用程序,在不同的线程中使用相同的变量和对象,而不考虑后果。我想将应用程序改进为线程安全(使用mutexatomic 等...) - 我如何测试我想要实现的东西是否真的有效? p>

我的意思是,如果没有这个,我的应用程序已经可以正常工作 - 但我很确定它只是因为可能的错误尚未发生,而不是因为我已经采取了措施来防止错误。

【问题讨论】:

您无法测试线程安全性。大多数不安全的操作都是未定义的行为,并且根据定义(UB)可能看起来有效。您只能设计线程安全。你可以通过测试证明代码不是线程安全的,但你永远无法通过测试证明代码线程安全的。 之后升级到线程安全是困难的,有时如果不进行重大重新设计是不可能的。你应该从一开始就设计线程安全。 也没有简单的测试方法。使用可以对它们进行单元测试和构建的线程安全数据结构。 你需要分析器它以保证线程安全。 【参考方案1】:

与测试任何未定义行为的方法相同。编写全面的测试,使用消毒剂运行它们,并希望获得最好的结果。

特别是在线程安全的情况下,您需要编写对共享数据进行并行操作的测试并使用线程清理器。

请始终牢记,没有任何测试足以证明程序中没有未定义的行为。

【讨论】:

Re,“……希望最好。” 不满意 当“最好”可能意味着经过数周甚至数月的测试后,您没有发现任何问题,然后您就可以发货了。然后,六个月后,一些客户安装了操作系统升级,而其他一些客户将他们的服务器转移到了新硬件上,一切都陷入了困境。 (别问我怎么知道的!!) @SolomonSlow 不管它是否令人满意,希望是你能得到的。测试无法证明缺少未定义的行为。最好在发货后继续测试产品……如果您的客户愿意为此付费。

以上是关于如何测试应用程序的线程安全性?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XCTest 测试线程安全性

我是怎样测试Java类的线程安全性的

java 单例 线程安全 写一个测试类 说明下面单例不是线程安全的

Java:测试对“非线程安全”方法的线程访问

多线程加强

测试应用程序是否是线程安全的