我正在研究客户端服务器应用程序.在某些时候,在某些机器上,当有超过5个客户端请求数据时,它似乎陷入僵局.如果我介入调试问题,那么程序似乎正在处理.只需设置一个断点,我知道程序正在执行,并导致它几次点击断点导致它完成.如果我在代码中的某些点插入Thread.Sleep(0),主要是围绕一些cpu密集循环,它似乎几乎完全解决了问题.我现在遇到的一个问题是,如果我调用Thread.Sleep(0)太多,它可能会减慢代码速度.如果我不够称呼它,代码似乎陷入僵局.虽然我可以验证它没有死锁,因为如果我进入代码,它会导致问题消失,因为我'
有没有一种很好的方法来确切地追踪导致这种情况的原因.它似乎只发生在运行Vista的笔记本电脑上,而不是在运行Windows XP的桌面上.但是,调试是不可能的,因为简单地插入代码会导致问题消失.我读过一些注释,调用Thread.Sleep(0)是一个不好的做法,并不应该是必要的,我不喜欢把巫术类型的代码放到我的应用程序中,我不明白为什么它必须在那里.任何指针都将非常感激.
[编辑]我还可以验证代码在"死锁"时仍然在运行,因为如果我留下足够长的时间,它就会完成,只需要花费的时间就要多出几个数量级.我的意思是,当它处于这种"死锁"模式时,它实际上至少慢了100倍.CPU固定在80-95%,所以它正在工作,尽管它正在做的事情超出我的范围,因为它需要永远完成任务.
[更多信息]仅仅因为这里的每个人都坚持认为这是一个死锁,我删除了所有锁定的代码.只有几行代码可以进行任何锁定.螺纹在大多数情况下完全独立工作,因此完全移除锁定并没有太大的作用.问题仍然存在.在我的代码中没有更多的synclocks,没有更多的互斥锁,我看到没有更多的东西会导致死锁,但问题仍然存在.而且它没有陷入僵局.即使它占用了所有处理器资源,它也会运行,尽管速度很慢.
Thread.Sleep(0)是一个收益率.我猜这会重新排列你打电话的方式以避免一些问题.我想如果你发布了带有yield的代码并在1000台机器上运行它,你会得到很多错误报告.我猜你需要一些类型的锁/关键部分来避免你的死锁,因为你的代码不是线程安全的.那可能是你正在打电话的图书馆.
添加日志记录并查看问题是否仍然存在.希望你能弄清楚导致死锁的功能是什么
添加一些关键部分.使用分而治之的方法,您应该能够缩小问题发生的位置.