调用sleep()时依然会占用cpu,但是为什么sleep(0)时候就会触发操作系统立刻重新进行一次CPU竞争,它不是还占用着cpu吗?
当 timeout = 0, 即 Sleep(0),如果线程调度器的可运行队列中有大于或等于当前线程优先级的就绪线程存在,操作系统会将当前线程从 处理器上移除,调度其他优先级高的就绪线程运行;如果可运行队列中的没有就绪线程或所有就绪线程的优先级均低于当前线程优先级,那么当前线程会继续执行, 就像没有调用 Sleep(0)一样。
当 timeout > 0 时,如:Sleep(1),会引发线程上下文切换:调用线程会从线程调度器的可运行队列中被移除一段时间,这个时间段 约等于 timeout 所指定的时间长度。为什么说约等于呢?是因为睡眠时间单位为毫秒,这与系统的时间精度有关。通常情况下,系统的时间精度 为 10 ms,那么指定任意少于 10 ms但大于 0 ms 的睡眠时间,均会向上求值为 10 ms。
而调用 SwitchToThread() 方法,如果当前有其他就绪线程在线程调度器的可运行队列中,始终会让出一个时间切片给这些就绪线程,而不管就绪线程的优先级的高低与否。
结论:
由上面的分析可以看出,如果我们想让当前线程真正睡眠一下子,最好是调用 Sleep(1) 或 SwitchToThread()。
如果当 timeout > 0 时,调用线程会从线程调度器的可运行队列中被移除一段时间,这段时间该线程依然还会占用cpu吗?
@Java水太深: 不会的。
@Daniel Cai: 不会占用cpu,它也不会释放锁,对吗?
@Java水太深: 你指什么锁?
@Daniel Cai: 就是对象锁
@Java水太深: 继续持有的。
@Daniel Cai: 一开始以为只要持有锁的话,就会占用cpu现在理解了