WaitForSingleObject在等待超时时间为零时会导致上下文切换吗?

Mar*_* Ba 8 c++ windows winapi multithreading

在等待超时时间为零的事件时,是否会WaitForSingleObject(或WaitForMultipleObjects)导致上下文切换?(Sleep(0)据我所知,会立即产生一个线程时间片.)

现在,关于WaitForSingle|MultipleObject和事件处理.如果WaitFor*Object实际上需要等待,它显然会产生剩余的时间片.然而,有两种情况API并没有需要等待:

  • 要么发出事件信号,在这种情况下它可以返回 WAIT_OBJECT_0
  • 或者事件的状态无关紧要,因为我指定等待时间为零,在这种情况下,它可以立即返回,或者使用WAIT_OBJECT_0WAIT_TIMEOUT

现在,鉴于此,WaitForSingleObject如果提供超时时间为零,将导致线程上下文切换?

Mar*_* Ba 5

现在,我似乎在写问题时找到了答案——这是我从可用文档中得出的假设

MSDN规定如下:

dwMilliseconds [in]

超时间隔,以毫秒为单位。如果指定了非零值,则函数将等待,直到指定的对象发出信号或间隔结束。如果 dwMilliseconds 为零,如果指定的对象没有发出信号,函数不会进入等待状态;它总是立即返回。如果 dwMilliseconds 是 INFINITE,则该函数将仅在指定对象发出信号时返回。

我认为这意味着如果对象有信号,它不会进入等待状态,我会将“不进入等待状态”解释为“没有发生上下文切换”。


wj3*_*j32 5

基于Windows Research Kernel和一些简单的逆向工程KeWaitForSingleObject,答案是否定的。查看WRK,在KiSwapThread调用之前检查内部计时器的到期时间,以确保在未发出信号的情况下函数立即返回。