在我们的应用程序中,有一个子系统侦听文件系统更改,包括通过网络进行的更改。有时,可能在网络处于压力之下时,监听线程可能会卡住。我强调,这里的讨论不是由不正确的线程同步引起的死锁。线程在第一次调用CreateFile
或者随后调用File System API时卡住。问题是,如何处理这样一个线程。
我可以确定给定线程在某段时间内处于非活动状态,并终止它。但权威的人说这是非常糟糕的,虽然我不明白为什么保持死线程比终止它更好。然后我想,我至少可以释放线程中分配的一些资源,例如文件句柄。
所以我创建了一个线程清理器,它关闭文件句柄并释放死线程分配的内存。但很快我惊讶地发现,更干净的线程在调用CloseHandle
API时陷入困境。我真的很震惊,因为我确信CloseHandle
不会卡住。
现在我完全不知所措,因为如果应用程序继续工作足够长时间,并且网络或其中的一部分仍有问题,那么我最终会遇到很多死线程,占用大量系统资源!
答案 0 :(得分:-1)
" Thread.Sleep(0)偶尔在生产代码中有用 高级性能调整。它也是一种出色的诊断工具 帮助发现线程安全问题:如果插入 Thread.Sleep(0)在您的代码中的任何地方创建或中断程序 几乎肯定有一个错误。"
请参阅sinon