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)时,操作系统将该线程从《运行态》转换到《就绪态》,绕过《等待态》,其状态转换如下图所示: