上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
4.2.12 线程的睡眠与唤醒
线程在执行的过程中可以调用Sleep函数,暂时进入睡眠状态,一定时间之后,再继续运行,睡眠的时间由Sleep函数的参数指定。Sleep函数把当前线程对象插入睡眠队列(lpSleepingQueue),然后引发一个线程重调度。
每次时钟中断,中断处理程序都会检查当前睡眠队列中,是否有睡眠时间到的线程,若有这样的线程,则时钟中断处理程序会从睡眠队列中把这些睡眠的线程删除,然后插入就绪队列,这样在合适的时刻,这些线程就会又被调度执行。
可以看出,睡眠时间虽然可以采用Sleep函数的参数以毫秒(ms)为单位进行指定,但实际的睡眠时间粒度应该是系统时钟频率。假设系统时钟中断周期为T(ms),而线程调用Sleep函数的时候,指定一个参数为t(ms),则实际上,该线程的睡眠时间应该为:
(t/T)*T+T (t % T !=0)
其中,t/T为t除T所得的结果的整数部分,而t%T则是t对T取模所得的结果。当然,如果t刚好能够被T整除,则睡眠时间就是t。
上述所谓的睡眠时间是线程处于睡眠状态的时间(在睡眠队列中的时间),上述时间到达后,线程并不一定马上得到调度,因为线程仅仅被重新插入就绪队列。若线程的优先级不是就绪队列中最高的,则可能不会被马上调度;若线程的优先级是最高的,则可以马上得到调度。