WaitForSingleObject被唤醒的时刻?解决思路

WaitForSingleObject被唤醒的时刻?
是在信号量一改变就被唤醒,还是把线程加入到就绪队列,等待下次时间片轮过来?

------解决方案--------------------
应该是马上被唤醒,但中间可能存在线程切换
------解决方案--------------------
(不小心发了)

牙医起得够早啊。

每个线程都有以下状态: 正在运行,等待,就绪??  (running, waiting, ready), 以下是State Machine:

Running --->
<---- Ready (线程切换)

Running ---> Wait (WaitOnSingleObject, 和其他等待状态) ---> Ready (When Signaled)

可以看出,一个处于等待状态的线程是永远轮不到执行的。当WaitForSingleObject被唤醒的时候(立即),系统只是把这个线程放到Ready队列里面,这样它就有被切入的机会了。

所以应该是后一个。
------解决方案--------------------
呵呵,可以做个实验来检查是立即唤醒还是放到等待队列里边等待时间片的分配。
同样的环境,同样的程序,同样的线程,通过记录内核对象被设置为信号状态到WaitOnSingleObject解除阻塞之间的时间差。进行统计。 在不同的线程优先级下的统计数据来分析。因该能说明问题。

如果是放入就绪队列,那么高优先级的唤醒时间应该少于低优先级别的。
如果是立即唤醒的话,应该不满足统计规律。

我也比较赞同放入就绪队列。因为windows不是实时系统,而且这样设计对这个问题的处理相对要容易些。