检查Win32线程是否正在运行或处于挂起状态

Can*_*pus 16 windows winapi

如何检查Win32线程是否正在运行或处于挂起状态?

我找不到任何给出线程状态的Win32 API.那么我如何获得线程状态?

Chr*_*cke 15

我认为 - 最初 - 没有提供此信息,因为提供此信息的任何API都会产生误导和无效.

考虑两种可能的情况 - 当前线程已暂停感兴趣的线程.当前线程中的代码知道挂起状态,并且应该能够共享它,因此内核团队无需添加API.

第二种情况,系统中的其他一些/第三个线程已经暂停了感兴趣的线程(并且无法跟踪哪个线程).现在你有一个竞争条件 - 其他线程可以在任何时候 - 取消挂起感兴趣的线程,并且从API中收集的信息是无用的 - 你有一个值,表明线程实际上是暂停的,而不是.

故事的道德 - 如果你想知道线程被挂起 - 暂停它:SuspendThread的返回值是线程的先前挂起计数.而现在你知道一些有用的东西 - 线程仍然悬而未决 - 这很有用.或者它没有(但现在是)被暂停.无论哪种方式,线程的状态现在都是确定性已知的,因此理论上您可以基于此做出一些明智的选择 - 无论是ResumeThread,还是保持暂停状态.

  • 除了"暂停"和"正在运行"之外还有线程状态.我认为OP更有可能知道哪些线程被阻止了.无论如何,你对竞争条件的看法是好的.如果有办法获得线程的状态,它应该仅用于提供信息.任何将其用于控制​​流程的尝试都将导致一个受伤的世界. (7认同)
  • 这个答案是错的.为什么它有9个赞成?您可以在此处找到有效的代码:http://stackoverflow.com/questions/22949725/how-to-get-thread-state-eg-suspended-memory-cpu-usage-start-time-priori (2认同)

Ste*_*ett 6

您可以通过使用 SystemProcessesAndThreadsInformation 的值(整数值 5)调用 NtQuerySystemInformation() 来获取此信息。

如果您想要一个可以使用此信息做什么的示例,请查看线程状态监视器