.net:线程调试

时间:2008-11-26 14:26:06

标签: .net multithreading

在.net环境中调试多线程问题有哪些可用的技术。

2 个答案:

答案 0 :(得分:2)

调试和单元测试多线程代码是非常困难的,我不相信有任何尝试和真正的解决方案来调试多个线程。

但是,通过从函数式编程语言中获取一些注释,可以更容易地编写多线程代码:

使用不可变数据结构:

在F#,Haskell,Erlang,OCaml等中编写多线程代码非常容易,因为这些语言中的数据结构和值是不可变的,这意味着一旦变量被赋值,就无法修改它。从本质上讲,这意味着每个变量都被声明为常量,并且没有像List.Add或Dictionary.Add这样的方法来改变集合。

Immuability意味着在声明之后不会有任何变异,因此你永远不必担心一个线程会改变另一个线程使用的共享状态。既然如此,您不必在代码中使用锁或互斥锁,并且已经消除了与竞争条件和死锁相关的整类线程错误。

依靠邮件传递以在流程之间共享数据 阅读这些博文:

Erlang是一种非凡的语言,特别是因为它的并发模型可以扩展到1000s和1000s的计算机。它不是让线程访问共享状态,而是依赖于消息传递将信息从一个线程发送到另一个线程。

依靠通道来同步线程 这是关于Newsqueak语言的精彩视频: http://video.google.com/videoplay?docid=810232012617965344

它描述了Newsqueak有趣的并发方法。它使用称为“通道”的对象将数据从一个线程传输到另一个线程。很容易找到频道的C#实现。

请记住,通过研究如何在其他语言中解决相同的问题,您可以学到很多关于解决.NET问题的知识。

答案 1 :(得分:0)

多线程错误的一个来源是无法锁定从多个线程使用的数据。对应用程序进行压力测试是一种揭示其中一些问题的技巧。争用数据频率越高的线程越多,发现问题的机会就越大。

发现您的数据已被不受保护的访问损坏可能会非常棘手。在显示生病症状之前,您的应用可能会跛行一段时间。断言可以帮助解决这个问题。它们在发生腐败后很快就会提高发现腐败的可能性。

另一种主要类型的多线程错误是死锁。您可以使用一种技术来查看您的应用程序是否正在调试死锁是使用锁定级别检查。锁定级别检查不等待发现死锁。它会在运行时提醒您存在死锁的可能性。

锁定级别检查的工作方式如下:假设您有3个锁定 - A,B和C.您可以分别为它们分别为1,2和3级。如果一个线程总是在更高级别的锁定之前声明一个更低级别的锁定,那么你将永远不会陷入一个线程可以声明A然后B而另一个声明B然后A的情况。要实现锁定级别检查,给每个锁定对象一个级别。使用线程本地存储,以便线程知道它上次声明的锁定级别。实际上在线程本地存储中有一个堆栈对象,因此当释放锁时,您知道上一次锁的级别。一些应用程序声称他们已经拥有锁。那很安全。要在线程锁定检查器中允许这样做,您需要扫描一堆锁定以查看它是否已被声明。

所有这些锁定级别检查都会造成性能损失。因此,它可能仅适用于调试或特殊构建。