如何测试线程安全

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

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

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

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

您也可以尝试使用Microsoft Research的CHESS

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

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

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

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

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

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

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

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

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