【问题标题】:Are there any benefits of suspending a thread over making it wait?挂起线程而不是让它等待有什么好处吗?
【发布时间】:2009-07-01 05:15:50
【问题描述】:

我正在查看遗留代码,发现代码使用 SuspendThread 函数来暂停工作线程的执行。每当工作线程需要处理请求时,调用线程就会恢复该工作线程。一旦任务完成,线程就会自行挂起。

我不知道为什么会这样。在我看来,使用带有 WaitForSingleObject API 的 Event 对象可以更优雅地完成。

我的问题是,与让线程等待同步对象相比,挂起线程有什么好处(如果有的话)?在哪些场景下您更喜欢 SuspendThread、ResumeThread API?

【问题讨论】:

  • +1,我正要发布这个问题。我很高兴我先搜索,而不必等待人们回答。

标签: windows multithreading winapi


【解决方案1】:

没有。

在我曾经工作过的每个环境中都不鼓励暂停线程。主要问题是线程可能会在持有某些资源的锁时被暂停,这可能会导致死锁。在同步对象方面节省的任何资源都不值得冒死锁风险。

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

如果您阅读SuspendThread 上的文档,您会发现它是供调试器使用的。如果可以的话,将其从任何应用程序代码中删除。


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

顺便说一句;我真的很惊讶 .NET 中的 Thread.Suspend 在 1.0/1.1 中得到“支持”,它确实应该从一开始就值得警告。

【讨论】:

  • 其次...无论您从使用suspend 中获得什么好处,唯一的缺点就是它通常不安全,而且是个坏主意。 .plus...每个线程一个内核对象不会杀死你。
  • 问题表明线程暂停了自身 - 所以它控制着自己的暂停。我同意在执行过程中在未知点暂停线程是一个非常糟糕的主意,但这不是问题要问的。
【解决方案2】:

如果您希望能够唤醒特定线程,则需要为每个线程提供一个单独的事件对象。这会导致更高的内核对象消耗,这本身并不好,并且可能会导致早期版本的 Windows 出现问题。使用手动恢复,您不需要任何新的内核对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多