如何测试线程安全性

16

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

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

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


这是一个类似的问题:https://dev59.com/iXVD5IYBdhLWcg3wBm5h - z -
谢谢,我四处看了看,但没有找到这个。 - tanascius
哎呀,重复的评论。 - Warren Dew
4个回答

11

您可以使用一些好的工具来测试所有线程问题,例如数据竞争、死锁、阻塞线程等。其中一个好的工具是intel-thread-checker

您还可以尝试微软研究院的CHESS


谢谢提供的链接 - 我现在正在看CHESS - 这些示例看起来非常有前途。 - tanascius
1
CHESS 绝对是前进的道路,也可以在 http://channel9.msdn.com/ 上观看相关视频。 - Chris Ballard

5

如果可能的话,请将线程数增加到一个很大的数字,甚至超过发布中将要使用的数量。运行许多线程的程序会更容易出现错误,因为更多的线程正在运行代码。

仔细检查你的声明、锁定、解锁、信号量计数等,并确保它们是合理的。

创建一个测试文档或电子表格,并利用你对代码的了解,思考可能发生竞争条件或死锁的地方。

从走廊里找些人进行“走廊可用性测试”(Joel on Software好像说过这个?)。通常,那些对你的程序不知所措的人很容易就能破坏它。


2
不错的问题。我通常通过生成许多线程并让它们疯狂执行我怀疑可能会受到竞态条件影响的操作来测试竞态条件。
也许你可以看看PNUnit - 尽管它可能与你所寻找的有些不同。作者说他们构建它是因为“我们需要模拟数百个客户端对同一服务器进行测试”。

-1

搜索调用线程例程的代码。如果找到任何线程相关的代码,则测试失败,因为您的代码存在多线程错误。

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

一旦确定存在线程错误,测试工作就完成了。剩下的只是找到并消除它们这个小问题...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接