2009-06-05 100 views
15

您有任何建议如何测试多线程应用程序?如何测试线程安全

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

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

+0

这里有一个类似的问题:http://stackoverflow.com/questions/111676/unit-testing-a-multithreaded-application – 2009-06-05 12:19:38

+0

谢谢,我有一个环顾四周,但没有找到这一个。 – tanascius 2009-06-05 12:25:22

回答

11

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

您也可以尝试,CHESS由微软研究院

5

尝试将线程数增加到很大数量(如果可能的话),甚至超过在发行版中使用的线程数。由于运行程序的线程数量很多,因为运行代码的线程越多,出现错误的频率越高。

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

创建测试文档或电子表格,并使用你的代码的知识,想在那里可能发生可能的竞争条件或死锁。

抓住一些人从大厅和做一个“走廊可用性测试”(乔尔的软件说我想的?)。一般来说,不知道你的程序做什么/关于什么的人将能够轻松地打破它。

2

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

也许你可以看看PNUnit - 虽然它可能来自你正在寻找一点点不同。作者说他们构建它是因为“我们需要在同一台服务器上模拟数百个客户端”。

-1

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

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

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