线程等待的原因

Roy*_*hti 2 windows winapi multithreading

我一直在使用我在以下帖子中找到的代码:

如何获取线程状态(例如暂停),内存+ CPU使用率,启动时间,优先级等

我正在检查线程状态,并且有以下枚举描述了线程"等待"状态的原因 -

enum KWAIT_REASON
{
    Executive,
    FreePage,
    PageIn,
    PoolAllocation,
    DelayExecution,
    Suspended,
    UserRequest,
    WrExecutive,
    WrFreePage,
    WrPageIn,
    WrPoolAllocation,
    WrDelayExecution,
    WrSuspended,
    WrUserRequest,
    WrEventPair,
    WrQueue,
    WrLpcReceive,
    WrLpcReply,
    WrVirtualMemory,
    WrPageOut,
    WrRendezvous,
    Spare2,
    Spare3,
    Spare4,
    Spare5,
    Spare6,
    WrKernel,
    MaximumWaitReason
};
Run Code Online (Sandbox Code Playgroud)

谁能解释一下什么WrQueue是,也许有什么差别WrUserRequestUserRequest是?

使用NtQuerySystemInformation()with 获取信息SystemProcessInformation.

RbM*_*bMm 5

WrQueue这是线程在内核中等待KQUEUE对象(在其中查找定义wdm.h)的时候.这可以是调用ZwRemoveIoCompletion或Win32 shell GetQueuedCompletionStatus(IOCP就是KQUEUE对象).或者线程(从vista开始)调用ZwWaitForWorkViaWorkerFactory(工厂工厂内部使用KQUEUE.也可能在内核调用中使用该线程KeRemoveQueue- 这通常是系统工作线程.

WrUserRequest由win32k.sys子系统使用.通常这是线程调用时GetMessage.因此,如果我们查看,WrUserRequest我们可以确定该线程正在等待窗口消息.

UserRequest-这意味着一些对象[S]在该线程等待经由WaitForSingleObject[Ex]WaitForMultipleObjects[Ex]MsgWaitForMultipleObjects[Ex](或它当量)