代码之家  ›  专栏  ›  技术社区  ›  Martin Ba

等待超时时间为零时,WaitForSingleObject是否会导致上下文切换?

  •  8
  • Martin Ba  · 技术社区  · 15 年前

    威尔 WaitForSingleObject (或) WaitForMultipleObjects )在等待超时时间为零的事件时导致上下文切换?( Sleep(0) 据我所知,将立即生成线程时间片。)

    现在,关于 WaitForSingle|MultipleObject 和事件句柄。如果waitfor*对象实际上需要等待,那么它显然会生成其剩余的时间片。但是,API有两种情况 需要等待:

    • 事件或发出信号,在这种情况下,它可以返回 WAIT_OBJECT_0
    • 或者事件的状态不重要,因为我指定了一个零的等待时间,在这种情况下,它可以立即返回,或者 等待对象 WAIT_TIMEOUT

    既然如此,威尔 等待线程结束 如果超时时间为零,是否导致线程上下文切换?

    2 回复  |  直到 15 年前
        1
  •  4
  •   wj32    15 年前

    基于Windows研究内核和一些简单的逆向工程 KeWaitForSingleObject ,答案是 . 查看WRK,检查内部计时器的到期时间之前 KiSwapThread 调用,确保在未向对象发出信号时立即返回函数。

        2
  •  4
  •   Martin Ba    15 年前

    现在我好像在写问题的时候找到了答案——这就是我 假定 从可用文档:

    这个 MSDN 声明如下:

    dw毫秒[in]

    超时间隔(毫秒)。如果非零值是 指定后,函数将一直等到 指定的对象发出信号或 间隔时间过去了。 如果 dwmillises为零,函数 如果 不向指定的对象发送信号 它 总是立即返回。如果 dwmillises是无限的, 只有当 指定的对象发出信号。

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