关闭

有用的sleep(1)

191人阅读 评论(0) 收藏 举报
本来想让一个线程没任务时就睡眠,使用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()。
/////////////////////////////////////////////////////////////////////////////////////////////



0
0
查看评论

C++ Sleep Function 用法 Sleep(-1)

//============================================================================ // Name : TestSleepFunction.cpp // Author : // Version ...
  • greenapple_shan
  • greenapple_shan
  • 2014-10-10 17:38
  • 1798

Linux操作系统 sleep(0)、sleep(1)和sleep(-1)的区别,他们各有什么作用

Linux操作系统 sleep(0)、sleep(1)和sleep(-1)的区别,他们各有什么作用? freeboy1015 2 票 2598 sleep(0)、sleep(1)、sleep(-1)的区...
  • boshuzhang
  • boshuzhang
  • 2016-03-26 11:54
  • 2003

Sleep(0)和Sleep(1)的区别

Sleep 接口均带有表示睡眠时间长度的参数 timeout。调用以上提到的 Sleep 接口,会有条件地将调用线程从当前处理器上移除,并且有可能将它从线程调度器的可运行队列中移除。这个条件取决于调用 Sleep 时timeout ...
  • pud_zha
  • pud_zha
  • 2013-02-16 13:58
  • 695

Sleep(0)与Sleep(1)的区别

 目的: 有时候我们想让线程不被调度一定的时间,也就是说让线程睡眠一段时间。 API 接口: 在 Win32中可以调用 Sleep,SleepEx 和 SwitchToThread 三个API。 VOID WINAPI&#...
  • xie1xiao1jun
  • xie1xiao1jun
  • 2014-11-10 18:06
  • 2488

thread.sleep(0)与thread.sleep(1)的区别

Thread.Yeild Yield 的中文翻译为 “放弃”,这里意思是主动放弃当前线程的时间片,并让操作系统调度其它就绪态的线程使用一个时间片。但是如果调用 Yield,只是把当前线程放入到就绪队列中,而不是阻塞队列。如果没有找到其它就绪态的线程,则当前线程继续运行。 ...
  • u012107806
  • u012107806
  • 2015-03-09 14:46
  • 2390

windows开发,如何使Sleep函数精确到1毫秒

1.我们知道,Sleep函数和GetTickCount函数,时间精度只有16ms左右, 而不是1ms。这样的话对于某些对时间要求比较高的应用场景,就不能 直接这么用了。 2.我介绍一个好方法,使用timeBeginPeriod和timeEndPeriod,举例如下: timeBeginPeriod(...
  • yuhengyue
  • yuhengyue
  • 2017-09-27 14:06
  • 490

关于Sleep(1)调用的问题

Sleep
  • zhulong20120418
  • zhulong20120418
  • 2016-04-25 14:05
  • 353

java 中的sleep()和wait() 等的区别和详解

1、sleep()  使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。 例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_P...
  • u011974987
  • u011974987
  • 2016-11-08 22:48
  • 2097

一条sleep语句引发的惨案

  我们的项目绝大部分都是基于java或者javaEE的应用,CTO早就有言在先,所有程序里面,不准有sleep语句。如果非要加上sleep语句,那么必须提出来,由项目的technical lead或者manager来决定是不是这么用 。   去年参与的一个项目,被一...
  • fiona_breadtree
  • fiona_breadtree
  • 2011-05-03 18:01
  • 1052

LINUX下实现sleep

sleep: 普通版本 1、基本设计思路:    1>注册SIGALRM信号的处理函数;     2>调用alarm(nsecs)设定闹钟;    3>调⽤pause等待,内核切换到别的进程运行;  ...
  • he_shuai20
  • he_shuai20
  • 2017-06-07 22:16
  • 866
    个人资料
    • 访问:356216次
    • 积分:5186
    • 等级:
    • 排名:第6329名
    • 原创:107篇
    • 转载:390篇
    • 译文:0篇
    • 评论:21条
    最新评论