Windows Sleep()函数之Sleep(0)用法

Sleep()函数简介

Sleep()函数一般常用于MFC程序,他是Windows API函数,定义在 "windows.h"头文件中。Sleep函数的作用就是让程序休眠指定时间,它的参数是以毫秒为单位进行休眠。比如:

Sleep(100);   //休眠100毫秒

注意事项

在调用Sleep函数时,需要注意一些事项:

  • Sleep函数会阻塞当前线程的执行,也就是说在Sleep函数执行期间,当前线程无法做其他的事情。
  • Sleep函数的延迟时间不是绝对准确的,可能会存在一定的误差。
  • Sleep函数的延迟时间是相对于调用Sleep函数时的系统时间的。也就是说,如果调用Sleep(1000)后,执行了一些耗时的操作,实际上Sleep函数执行的时间会更长。

Sleep(0)的妙用

Sleep()函数用在多线程环境下时,主要用途是让当前线程放弃CPU调度,让出CPU资源占用。

如UDP数据收发线程示例代码:

UINT  UdpThreadFunc(LPVOID pPara)
{
    while(true)
    {
        udp_sock.sendto();    //发送数据
        
        udp_sock.recvfrom();  //接收数据
        
        Sleep(10);            //Sleep 10毫秒
    }
}

如果不加 Sleep(10),则该线程一致占用CPU调度权。会影响其他线程的调度和执行。

备注: 线程内的 Sleep()函数精度一般都会有一定的误差,比如Sleep(100),实际上达不到精确的100毫秒。用户可以自己测试,测试代码参考如下:

UINT  UdpThreadFunc(LPVOID pPara)
{
    while(true)
    {
        SYSTEMTIME st;
        ::GetLocalTime(&st);
        printf("【当前时间】= %02d:%02d:%02d.%03d\n",st.wHour,st.wMinute,st.wSecond,st.wMilliseconds);
        
        Sleep(100);            //Sleep 100毫秒
    }
}

Sleep(0)妙用

在讲Sleep(0)前,先简单回顾下操作系统的进程运行状态模型,典型的进程三态模型及其状态转换如下图所示:
在这里插入图片描述

当我们在线程函数中Sleep(100)时,操作系统将该线程从《运行态》转换到《等待态》,其状态转换如下图所示:
在这里插入图片描述

函数Sleep(100)休眠时间结束后,操作系统将该线程从《等待态》转换到《就绪态》,其状态转换如下图所示:
在这里插入图片描述

操作系统按时间片调度就绪队列中的任务,此时该线程被调度到CPU,其线程状态从《就绪态》转换到《运行态》,其状态转换如下图所示:
在这里插入图片描述

重点来了

当我们在线程函数中Sleep(0)时,操作系统将该线程从《运行态》转换到《就绪态》,绕过《等待态》,其状态转换如下图所示:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值