线程等待的原因

时间:2017-12-28 14:28:57

标签: windows multithreading winapi

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

How to get thread state (e.g. suspended), memory + CPU usage, start time, priority, etc

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

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
};

任何人都可以解释WrQueue是什么,以及WrUserRequestUserRequest之间的区别是什么?

使用NtQuerySystemInformation() SystemProcessInformation获取信息。

1 个答案:

答案 0 :(得分:5)

WrQueue这是线程在内核中等待KQUEUE对象(在wdm.h中查找它)的时候。这可以调用ZwRemoveIoCompletion或Win32 shell GetQueuedCompletionStatus IOCP 正好是KQUEUE个对象)。或者线程(从vista开始)调用ZwWaitForWorkViaWorkerFactoryworker factory在内部使用KQUEUE。也可能在内核调用KeRemoveQueue中的线程 - 这通常是系统工作线程。

win32k.sys子系统使用

WrUserRequest。通常这是线程调用GetMessage时。因此,如果我们查看WrUserRequest,我们可以确定线程正在等待窗口消息。

UserRequest - 这意味着线程通过WaitForSingleObject[Ex]WaitForMultipleObjects[Ex]MsgWaitForMultipleObjects[Ex](或等价物)等待某些对象