【问题标题】: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_0 或WAIT_TIMEOUT
现在,鉴于此,如果提供的超时时间为零,WaitForSingleObject 会导致线程上下文切换吗?
【问题讨论】:
标签:
c++
windows
multithreading
winapi
【解决方案1】:
基于 Windows Research Kernel 和 KeWaitForSingleObject 的一些简单逆向工程,答案是否。查看 WRK,在调用 KiSwapThread 之前检查内部计时器的到期时间,确保在未发出信号时函数立即返回。
【解决方案2】:
现在我在写问题时似乎找到了答案——这是我从可用文档中假设的内容:
MSDN 声明如下:
dwMilliseconds [in]
超时间隔,以毫秒为单位。如果一个非零值是
指定,函数等待直到
指定的对象发出信号或
间隔过去。 如果
dwMilliseconds 为零,函数
不进入等待状态,如果
指定对象未发出信号;它
总是立即返回。如果
dwMilliseconds 是 INFINITE,即
函数只会在
指定对象发出信号。
我认为这意味着它也如果对象发出信号不会进入等待状态,我会解释“不进入等待状态”为“没有上下文切换发生”。