代码之家  ›  专栏  ›  技术社区  ›  Canopus

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

  •  4
  • Canopus  · 技术社区  · 15 年前

    我检查了一个遗留代码,发现代码使用suspend thread函数来暂停工作线程的执行。每当工作线程需要处理一个请求时,调用线程就会恢复这个工作线程。任务完成后,线程将自行挂起。

    我不知道为什么要这样做。据我所知,使用带有WaitForSingleObject API的事件对象可以更优雅地完成这项工作。

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

    2 回复  |  直到 15 年前
        1
  •  11
  •   Kevin Montrose    15 年前

    不。

    在我曾经工作过的每一个环境中,挂起线程都是不可取的。主要的问题是,线程在持有某个资源上的锁时可能被挂起,这可能导致死锁。任何保存在同步对象方面的资源都不值得冒死锁风险。

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

    如果您在 SuspendThread ,您将看到它是供调试人员使用的。如果可以的话,从任何应用程序代码中删除它。


    为了说明我的观点,我遇到的“请勿使用”悬挂方法列表如下:

    顺便提一句,我真的很惊讶在.NET中的thread.suspend在1.0/1.1中得到了“支持”,从一开始它就应该是值得警告的。

        2
  •  2
  •   sharptooth    15 年前

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