是否有任何暂停线程,使其等待的好处?

我正在通过一个遗留代码,发现代码使用SuspendThread函数暂停工作线程的执行。 每当工作者线程需要处理请求时,调用线程就会恢复这个工作线程。 一旦任务完成,线程将自行暂停。

我不知道为什么这样做。 根据我的说法,使用带有WaitForSingleObject API的Event对象可以做得更加优雅。

我的问题是,挂起一个线程的好处(如果有的话)与使一个线程等待同步对象相比,有什么好处? 在哪种情况下,您会更喜欢SuspendThread,ResumeThread API?

没有。

暂停一个线程在我曾经工作过的每个环境中都是不鼓励的。主要的问题是一个线程可能在某个资源的某个锁上被挂起,可能导致死锁。 根据同步对象保存的任何资源都不值得承担死锁风险。

当线程等待时,这不是一个问题,因为线程固有地控制了自己的“暂停”,并且可以确保释放它所持有的任何锁。

如果你阅读了SuspendThread的文档,你会发现它是供调试器使用的。 如果可以的话,把它从任何应用程序代码中撕下来。


为了说明我的观点,列出了我所遇到的“不使用”暂停方法:

  • SuspendThread
  • Thread.Suspend
  • Thread.suspend

作为旁白; 我真的很惊讶,.NET中的Thread.Suspend在1.0 / 1.1版本中是“支持”的,从一开始就应该是值得警惕的。

如果您想要唤醒特定的线程,则需要为每个线程分别设置一个事件对象。 这会导致更高的内核对象消耗,这本身并不好,可能会导致早期版本的Windows出现问题。 手动恢复你不需要任何新的内核对象。