有用的sleep(1)

转载 2016年06月01日 13:49:14
本来想让一个线程没任务时就睡眠,使用Sleep(0)还是非常占用CPU,郁闷啊.

呵呵,在实际的编程中,如果出现占用CPU居高不下的情况时,都是Sleep(1)。Sleep(10)对系统的性能有一定的影响。Sleep(1)是有据可查的。

“Notice the call to Sleep at the end of the loop. I’ve heard quite a bit of debate about the relative merits of Sleep(0) versus Sleep(1) for giving up your time slice. 

Here’s what the documentation says: “A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run.” This means that if other threads aren’t quite ready or aren’t of equal priority, they won’t run. I’ve seen tests indicating that Sleep(1) is often a more effective way of yielding.”

/////////////////////////////////////////////////////////////////////////////////////////////
深入分析Sleep(0)与Sleep(1)的区别
罗朝辉 (http://www.cppblog.com/kesalin/)  CC许可,转载请注明出处

目的:有时候我们想让线程不被调度一定的时间,也就是说让线程睡眠一段时间。
 
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()。
/////////////////////////////////////////////////////////////////////////////////////////////



RTX实时平台-Sleep(1)实例代码

  • 2010年05月24日 14:25
  • 456KB
  • 下载

Nanos-操作系统oslab1(2)---sleep和wakeup

目标: 这次要为进程实现sleep功能和wakeup功能,所以我们需要添加两个队列,一个是运行队列runningList,还有一个则是等待队列waitingList。 链表的使用 提供的链表节点结构如...

【C#】36. 多线程基础(1) Thread Start、Sleep

C#多线程基础

基于python的有趣(有用)脚本 Part.1

基于python的有趣(有用)脚本 Part.1 1、动机     因为近期月饼事件比较火,所以也想写一些有意思的脚本。一方面防止编程技术生疏,一方面也是为生活增添乐趣。     这回写...
  • hewb14
  • hewb14
  • 2016年10月01日 00:03
  • 992

继承自NSObject的不常用又很有用的函数(1)

load函数+(void)load当类被引用进程序的时候会执行这个函数。在一个程序开始运行之前(在main函数开始执行之前),在库开始被程序加载,load函数就会开始被执行。我们开发的程序都可以认为是...

android有用代码片段1

[-] 一  获取系统版本号二获取系统信息三获取安装路径和已安装程序列表四获取图片应用名包名五解决listview上 Item上有按钮时 item本身不能点击的问题六不让文本框输入中文七获取屏幕宽高...

单片机C51编程几个有用的模块(1)

单片机C51编程几个有用的模块(1)   Keil C51常用功能模块使用说明 说明 本文档包括单片机系统中常用到的时钟中断、通讯及键盘扫描等模块(见所附源程序...
  • zd_2010
  • zd_2010
  • 2015年04月29日 14:20
  • 977

Linux学习【1】——linux中“男人”是很有用的(获取帮助全揽)

linux获取命令的帮助信息: 外部命令:COMMAND --help   例:ls –help   内部命令:help COMMAND  例:helphistory man命令:(manua...

开发人员非常有用的Java功能代码(1-10)

1. 把Strings转换成int和把int转换成String String a = String.valueOf(2); //integer to numeric string ...
  • alexbxp
  • alexbxp
  • 2011年11月16日 20:40
  • 570

1.android:整理出15个Android很有用的代码片段(技巧)

1:查看是否有存储卡插入 String status=Environment.getExternalStorageState(); if(status.equals(Enviroment.MEDI...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有用的sleep(1)
举报原因:
原因补充:

(最多只允许输入30个字)