睡零秒(译文)
By S.F.
本文链接 https://www.kyfws.com/news/sleeping-for-zero-seconds/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 2 分钟阅读 - 986 个词 阅读量 0睡零秒(译文)
原文地址:https://www.codeproject.com/Articles/43699/Sleeping-for-Zero-Seconds
原文作者:Joel Ivory Johnson
译文由本站翻译
前言
睡零秒
在网上发布的一些示例代码中,有人问我一些奇怪的事情.有问题的代码是对" sleep"函数的单次调用.
Thread.Sleep(0);
或者,如果您希望查看本机代码版本:
Sleep(0);
sleep函数通常用于在代码中插入延迟.但是插入零延迟意味着什么?如果我们先看一下API文档,这将更有意义.我从本地API文档中为sleep
函数提取了以下描述:
因此,通过调用此函数可以执行两个操作:
睡眠零秒将导致线程放弃控制,但是它将保持可运行状态.线程可运行是什么意思?要了解这一点,必须了解多任务的工作原理.在最简单的层次上,单个核心处理器一次只能运行一个线程或程序.通过将控制权从一个程序快速切换到另一个程序,可以保持多个程序同时执行某件事的错觉.当操作系统确定要切换到下一个线程的因素时,哪个线程是可运行的.线程可能会自动变为无法运行(通过调用"睡眠"功能或使用其他与线程相关的API),或者线程可能会进行调用,而该调用需要一些时间才能完成事件,例如对驱动器或网络设备的IO请求.当线程再次变为可运行时,然后将其重新引入为候选线程以接收执行时间.
当程序调用" Sleep(0)“时,永远不会使其无法运行.它仅允许操作系统继续执行并安排下一个线程执行.
什么时候适合使用Sleep(0)?
在大多数情况下,我在代码中使用” Sleep(0)",其中主程序循环不受消息和事件的驱动.对于由消息和事件驱动的程序,如果该程序未接收到任何消息(例如,用户操作通知,GPS坐标更改,计时器到期等),则该程序没有执行任何操作.这种性质的程序一生中大部分时间不会做任何事情.尽管用户通常不会那样看待这些程序.不依赖于要运行的消息和事件的程序(通常是游戏或媒体密集型应用程序)会连续执行,并且会很快消耗CPU带宽.将Sleep(0)''放到此类程序的主循环中将使其他程序有执行的机会(而不是由于另一个进程独占CPU而被锁定),在某些情况下,
Sleep (0)``可帮助更好地保持电池寿命.
CodeProject
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
All-Topics 新闻 翻译