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

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

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

Solutions Collecting From Web of "检查一个Win32线程是否正在运行或处于挂起状态"

我认为 – 最初 – 这个信息没有提供,因为任何提供这个信息的API都是误导和无用的。

考虑两种可能的情况 – 当前线程暂停了兴趣线程。 当前线程中的代码知道挂起状态,应该能够共享它,这样就不需要内核团队添加一个API。

第二种情况,系统中的其他/第三个线程暂停了感兴趣的线程(并且无法跟踪哪个线程)。 现在你有一个竞争条件 – 其他线程可以在任何时候将感兴趣的线程解锁,并且从API中获得的信息是无用的 – 你有一个值,表示线程在事实上是暂停的,而不是。

道德的故事 – 如果你想知道一个线程被挂起 – 挂起它:从SuspendThread的返回值是线程以前的挂起计数。 而现在你知道一些有用的东西 – 线程仍然被暂停 – 这是有用的。 或者它不是(现在是)暂停。 无论哪种方式,线程的状态是确定性已知的,所以你可以在理论上做出一些明智的选择 – 无论是ResumeThread,还是保持暂停状态。

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

如果你想要一个你可以用这个信息做什么的例子,请看线程状态监视器 。

WMI的Win32_Thread类有一个ThreadState属性,其中5:“暂停阻塞”和6:暂停就绪。

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

编辑:鉴于这个PowerShell查询:

 gwmi win32_thread | group ThreadState 

计数名称组
 ----- ---- -----
     6 2 {,,,...}
   966 5 {,,,...}

WMI具有“暂停”到Win32的不同定义。

虽然它没有记录 – 虽然它应该是恕我直言,如果您调用WaitForSingleObject,它将返回WAIT_ABANDONED如果线程被挂起。 而且,如果一个线程被终止,它的句柄将处于一个信号状态。

当有人通过告诉你为什么你不应该回答你的问题来回答你的问题,或者开始质疑你为什么要这么做的时候,最让我感到困扰的是什么。 当有人在谷歌上发现这个问题时, WHY的原因是不一样的,因此答案会使自己对其他人无用。

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

在这里看到UmsThreadIsSuspended

你可以像这样的代码获得线程暂停计数:

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

但是,如前所述 – 这是不准确的。 而且,暂停线程是邪恶的。

你不幸的是, 取决于你的代码,你可以近似这个(通过设置一个标志,例如,当你等待一个内核对象时),但是要记住,一个线程总是可以在OS或者库调用内部阻塞,而你不知道这个。

我认为这里的状态被称为

  • 如果线程处于线程处理,则进行一些处理或
  • 等待事件

这可以通过使用变量来处理,如果一个线程正在运行或正在等待事件发生。

当考虑线程池时,会出现这些情况,有n个线程,并且基于每个线程的运行状态,可以将任务分配给空闲线程。

是的:有可能获得线程状态并确定它是否被挂起。

和否:你不需要Windows 7来做到这一点。

我在这里发布我的工作班在Stackoverflow: 如何获得线程状态(如暂停),内存+ CPU使用率,开始时间,优先级等

这个类需要Windows 2000或更高版本。