如何测试线程安全[重复]

Posted

技术标签:

【中文标题】如何测试线程安全[重复]【英文标题】:How to test for thread safety [duplicate] 【发布时间】:2010-10-31 15:09:29 【问题描述】:

您对如何测试多线程应用程序有什么建议吗?

我知道,线程错误很难捕获,它们可能随时发生——或者根本不发生。测试很困难,结果永远无法确定。当然最好仔细设计和编程并发模块。 尽管如此 - 我不想遗漏测试方面。因此,运行大量线程,它们都在处理相同的项目,有时会引发线程错误。

有什么想法或最佳实践可以提高隐藏线程错误的命中率吗? (我正在使用 .Net/C#)

【问题讨论】:

这里有一个类似的问题:***.com/questions/111676/… 谢谢,我看了一圈,没找到这个。 糟糕,重复评论。 【参考方案1】:

您可以使用一些好的工具来测试所有线程问题,例如数据争用、死锁、停滞线程等。 intel-thread-checker 就是这样一款好工具。

你也可以试试,CHESS 微软研究院

【讨论】:

感谢您的链接 - 我现在正在研究 CHESS - 这些示例看起来很有希望 国际象棋绝对是最佳选择,也可以在channel9.msdn.com 上查看视频【参考方案2】:

如果可能,请尝试将线程数增加到较大的数量,甚至超过发布中将使用的线程数。由于有很多线程在运行您的程序,因此会更频繁地出现错误,因为更多线程在代码上运行。

仔细检查您的声明、锁定、解锁、信号量计数等,确保它们有意义。

创建一个测试文档或电子表格,并利用您对代码的了解,考虑可能发生争用条件或死锁的位置。

从大厅找一些人做一个“走廊可用性测试”(Joel on Software 说我认为?)。一般来说,不知道你的程序做什么/关于什么的人可以很容易地破解它。

【讨论】:

【参考方案3】:

好问题。我通常通过产生许多线程并让它们疯狂地执行我怀疑可能会受到竞争条件影响的操作来测试竞争条件。

也许您可以查看PNUnit - 尽管它可能与您要查找的内容有些不同。作者说他们构建它是因为“我们需要针对同一台服务器模拟数百个客户端”。

【讨论】:

【参考方案4】:

用于调用线程例程的 grep 代码。如果发现任何问题,请通过测试,因为您的代码存在多线程错误。

如果通过,请将搜索扩展到您使用的库的部分,直到失败或(不太可能)被证明是线程安全的(即单线程)。

一旦你知道你有线程错误,工作的测试部分就完成了。剩下的就是找到并删除它们的小事......

【讨论】:

以上是关于如何测试线程安全[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 在多线程环境中测试某些东西 [重复]

如何在退出前安全地关闭所有线程[重复]

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

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

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

如何解决线程安全问题