【问题标题】:Will WaitForSingleObject cause a context switch when waiting with a timeout time of zero?WaitForSingleObject 在等待超时时间为零时会导致上下文切换吗?
【发布时间】:2011-05-11 08:16:18
【问题描述】:

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

现在,关于WaitForSingle|MultipleObject 和事件句柄。如果 WaitFor*Object 确实需要等待,它显然会产生剩余的时间片。但是,有两种情况 API 不需要需要等待:

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

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

【问题讨论】:

    标签: c++ windows multithreading winapi


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      MSDN 声明如下:

      dwMilliseconds [in]

      超时间隔,以毫秒为单位。如果一个非零值是 指定,函数等待直到 指定的对象发出信号或 间隔过去。 如果 dwMilliseconds 为零,函数 不进入等待状态,如果 指定对象未发出信号;它 总是立即返回。如果 dwMilliseconds 是 INFINITE,即 函数只会在 指定对象发出信号。

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

      【讨论】:

        猜你喜欢
        • 2014-09-23
        • 1970-01-01
        • 2016-10-20
        • 1970-01-01
        • 2012-05-09
        • 1970-01-01
        • 1970-01-01
        • 2011-01-02
        相关资源
        最近更新 更多