深入分析Sleep(0)与Sleep(1)的区别
来源:互联网 发布:淘宝社区首页 编辑:程序博客网 时间:2024/05/22 15:43
目的:
有时候我们想让线程不被调度一定的时间,也就是说让线程睡眠一段时间。
API 接口:
在 Win32中可以调用 Sleep,SleepEx 和 SwitchToThread 三个API。
VOID WINAPI Sleep(DWORD dwMilliseconds);
DWORD WINAPI SleepEx(DWORD dwMilliseconds, BOOl bAlertable);
BOOl WINAPI SwitchToThread();
在托管代码中,我们可以调用静态方法 Thread.Sleep。
分析:
Sleep 接口均带有表示睡眠时间长度的参数 timeout。调用以上提到的 Sleep 接口,会有条件地将调用线程从当前处理器上移除,并且有可能将它从线程调度器的可运行队列中移除。这个条件取决于调用 Sleep 时timeout 参数。
当 timeout = 0, 即 Sleep(0),如果线程调度器的可运行队列中有大于或等于当前线程优先级的就绪线程存在,操作系统会将当前线程从处理器上移除,调度其他优先级高的就绪线程运行;如果可运行队列中的没有就绪线程或所有就绪线程的优先级均低于当前线程优先级,那么当前线程会继续执行,就像没有调用 Sleep(0)一样。
当 timeout > 0 时,如:Sleep(1),会引发线程上下文切换:调用线程会从线程调度器的可运行队列中被移除一段时间,这个时间段约等于 timeout 所指定的时间长度。为什么说约等于呢?是因为睡眠时间单位为毫秒,这与系统的时间精度有关。通常情况下,系统的时间精度为 10 ms,那么指定任意少于 10 ms但大于 0 ms 的睡眠时间,均会向上求值为 10 ms。
而调用 SwitchToThread() 方法,如果当前有其他就绪线程在线程调度器的可运行队列中,始终会让出一个时间切片给这些就绪线程,而不管就绪线程的优先级的高低与否。
结论:
由上面的分析可以看出,如果我们想让当前线程真正睡眠一下子,最好是调用 Sleep(1) 或 SwitchToThread()。
- 深入分析Sleep(0)与Sleep(1)的区别
- 深入分析Sleep(0)与Sleep(1)的区别
- 深入分析Sleep(0)与Sleep(1)的区别
- 深入分析Sleep(0)与Sleep(1)的区别
- 深入分析Sleep(0)与Sleep(1)的区别
- 深入分析Sleep(0)与Sleep(1)的区别
- 深入分析Sleep(0)与Sleep(1)的区别
- win32平台而非linux平台下 深入分析Sleep(0)与Sleep(1)的区别
- Sleep(0)与Sleep(1)的区别
- Sleep(0)与Sleep(1)的区别
- thread.sleep(0)与thread.sleep(1)的区别
- Sleep(0)和Sleep(1)的区别
- sleep(0) 与sleep(1)
- sleep(0) 与sleep(>0)区别
- Linux操作系统 sleep(0)、sleep(1)和sleep(-1)的区别,他们各有什么作用
- sleep与wait的区别
- sleep与wait的区别
- sleep()与wait()的区别
- 数据结构算法代码
- 为Symfony2和Redis正名,基于PHP的10亿请求/周网站打造
- 正则表达式删除注释及空白行
- MFC学习笔记.day01续-调试MessageBox,注册窗口,创建窗口,显示,更新,消息循环,回调函数
- 【Java】找出数组中的某个元素,数组原本有序,但已被旋转多次
- 深入分析Sleep(0)与Sleep(1)的区别
- POJ 1655 Balancing Act (树形dp 树的重心)
- linux(ubuntu) 下 无法打开(挂载)U盘,或者双系统的window下的盘符
- 孤立点挖掘算法
- sql server生成临时表的快捷方法
- 数据挖掘笔记
- php.ini的加载位置
- 精美轮播图(完整代码)
- leetCode 78.Subsets (子集) 解题思路和方法