如何测试线程安全性

时间:2009-06-05 12:12:38

标签: c# multithreading concurrency testing

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

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

获取隐藏线程错误的高命中率的任何想法或最佳做法? (我正在使用.Net / C#)

4 个答案:

答案 0 :(得分:11)

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

您也可以尝试使用Microsoft Research的{​​{3}}

答案 1 :(得分:5)

如果可能的话,尝试将线程数增加到一个很大的数量,甚至超过在发布中使用的数量。由于运行程序的线程很多,因此在代码上运行更多线程时会出现更多错误。

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

创建测试文档或电子表格,并使用您对代码的了解,考虑可能出现的竞争条件或死锁的位置。

从大厅抢走一些人并进行“走廊可用性测试”(Joel on Software说我认为?)。一般来说,不知道你的程序是什么/关于什么的人将能够轻松地打破它。

答案 2 :(得分:2)

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

也许你可以看看PNUnit - 虽然它可能与你想要的有点不同。作者说他们建造它是因为“我们需要针对同一台服务器模拟数百个客户端”。

答案 3 :(得分:-1)

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

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

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