我正在浏览遗留代码并发现代码使用SuspendThread函数来暂停工作线程的执行。只要工作线程需要处理请求,调用线程就会恢复此工作线程。任务完成后,线程将自行挂起。
我不知道为什么这样做。根据我的说法,使用带有WaitForSingleObject API的Event对象可以更优雅地完成它。
我的问题是,与使线程等待同步对象相比,挂起线程有什么好处(如果有的话)?在哪种情况下,您更喜欢SuspendThread,ResumeThread API?
答案 0 :(得分:11)
没有
在我曾经工作的每个环境中都不鼓励暂停线程。主要关注的是线程可能会在某个资源上锁定时被挂起,可能导致死锁。根据同步对象保存的任何资源都不值得死锁风险。
当一个线程等待时,这不是一个问题,因为线程固有地控制它自己的“暂停”并且可以确保释放它所持有的任何锁。
如果您阅读SuspendThread上的文档,您将看到它适用于调试器。如果可以,请将其从任何应用程序代码中删除。
为了说明我的观点,我遇到了一个“不使用”暂停方法的清单:
撇开;我真的很惊讶.NET中的Thread.Suspend在1.0 / 1.1中得到“支持”,它从一开始就应该是值得警告的。
答案 1 :(得分:2)
如果您希望能够唤醒特定线程,则每个线程都需要一个单独的事件对象。这将导致更高的内核对象消耗,这本身并不好,并且可能在早期版本的Windows上引起问题。使用手动恢复,您不需要任何新的内核对象。