Sleep函数的真正用意

简介:

关于VOID Sleep(DWORD dwMilliseconds);函数,许多人都觉得,它是告诉系统,延迟多少毫秒来执行后面的代码。

但是,在WINDOWS这样的非实时多任务系统中,我们是无法估算会睡眠多久的。因为一个线程不是总是被执行的。它会在执行一段时间后,被系统暂停,然后系统又去执行另外的线程代码。于是,Sleep函数的解释如下:


当调用Sleep函数的时候,比如Sleep(400);它告诉系统,此线程将放弃此次运行的时间片,比方说现在线程只执行了10ms,按“有关部门规定”它被唤醒一次是要执行20ms的。这时它就说,这次机会我放弃,后面的10ms不要了。下次轮上我再叫我。 这样,系统便会将其终止,然后再一次进行调度选择。如果它运气很好,又被选中了,系统则会查看这个线程是否处于sleep标志中。如果发现他还需要继续睡眠,则重新进行调度选择,直到选择一个有权执行的线程为止。 如果很不幸,400ms到了,但是系统很忙,调度算法在很长一段时间也没有选择到这个线程,那这么线程就很继续休眠。于是说,这个Sleep(400);将导致这个线程会休眠大于等于400MS的时间。


以前我做程序的时候也用过Sleep来作为控制程序执行速度的方法。现在想来,的确很欠考虑。


关于这个函数更具权威的解释(抄书):

1、调用Sleep,可使线程自愿放弃它剩余的时间片。

2、系统将在大约的指定秒数内使线程不可高度。不错,如果告诉系统,想睡眠100MS,那么可以睡大约这么长的时间,但也也可能睡眠数秒或数分钟。记住,WINDOWS不是个实时操作系统。虽然线程可能在规定的时间被唤醒,但是它能否做到,取决于系统中还有什么操作正在进行。

3、可以调用Sleep(INFINITE),告诉系统永远不要调用这个线程。但最好不要这样,让线程退出就行了。反正你都不再需要它。或者调用Sleep(0);告诉系统线程将放弃剩于的时间片,并使系统调度另一个线程。但是,系统可以对刚刚调用Sleep的线程重新调度。如果不存在多个拥有相同优先级的可调度线程。就会出现这种情况。

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2010/07/02/1940485.html

目录
相关文章
|
2天前
|
Java 调度
一张图搞清楚wait、sleep、join、yield四者区别,面试官直接被征服!
一张图搞清楚wait、sleep、join、yield四者区别,面试官直接被征服!
16 2
|
6月前
|
前端开发 Java 程序员
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法(一)
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法
|
6月前
|
程序员 调度
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法(二)
多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法
|
6月前
|
Java API Go
线程介绍,线程与进程区别,如何使用多线程,Thread类,Runnable接口,补充知识(方法重载,方法重写)
线程介绍,线程与进程区别,如何使用多线程,Thread类,Runnable接口,补充知识(方法重载,方法重写)
|
4月前
|
资源调度 调度
Thread的基本方法(3)-yield方法的分析与实例说明
Thread的基本方法(3)-yield方法的分析与实例说明
30 0
|
8月前
线程通信的例子
线程通信的例子
34 0
|
9月前
|
调度
Thread 类中的 yield()方法有什么作用?
Thread 类中的 yield()方法有什么作用?
101 0
wait 和 waitpid 的区别(附有案例代码)
wait 和 waitpid 的区别(附有案例代码)
|
调度
Thread 类的基本用法——一网打尽
Thread 类的基本用法——一网打尽
|
Java 调度
69. 对并发熟悉吗?谈谈线程间的协作(wait/notify/sleep/yield/join)
69. 对并发熟悉吗?谈谈线程间的协作(wait/notify/sleep/yield/join)
46 1
69. 对并发熟悉吗?谈谈线程间的协作(wait/notify/sleep/yield/join)