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

时间:2009-06-17 12:28:07

标签: windows winapi

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

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

7 个答案:

答案 0 :(得分:15)

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

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

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

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

答案 1 :(得分:3)

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

如果您想了解如何处理此信息,请查看Thread Status Monitor

答案 2 :(得分:2)

WMI的Win32_Thread类有ThreadState属性,其中5:“暂停被阻止”,6:暂停就绪。

您需要Thread的ID才能直接获取正确的实例(WMI对象的Handle属性是线程ID)。

编辑:鉴于此PowerShell查询:

gwmi win32_thread | group ThreadState

给出

Count Name  Group
----- ----  -----
    6 2     {, , , ...}
  966 5     {, , , ...}

WMI对Win32的“暂停”定义不同。

答案 3 :(得分:1)

在Windows 7中,您可以使用QueryUmsThreadInformation。 (UMS代表用户模式调度)。

UmsThreadIsSuspended查看{{1}}。

答案 4 :(得分:1)

您可以使用以下代码获取线程挂起计数:

DWORD GetThreadSuspendCount(HANDLE hThread) {
    DWORD dwSuspendCount = SuspendThread(hThread);
    ResumeThread(hThread);
    return dwSuspendCount;
}

但是,正如已经说过的那样 - 这是不准确的。 而且,暂停一个线程是邪恶的。

答案 5 :(得分:0)

我认为这里的州被称为

  • 如果线程处于线程proc中,则进行一些处理或
  • 等待活动

这可以通过使用变量来处理,该变量可以告诉线程是否实际正在运行或等待事件发生。

这些场景在考虑线程池时出现,有一些n个线程并且基于每个线程运行状态,可以将任务分配给空闲线程。

答案 6 :(得分:0)

是:可以获取线程状态并确定它是否被暂停。

并且否:您不需要Windows 7来执行此操作。

我在Stackoverflow上发布了我的工作班:How to get thread state (e.g. suspended), memory + CPU usage, start time, priority, etc

此类需要Windows 2000或更高版本。