Sleep和 SleepEx函数的功能是在指定的执行时间内中止所在线程的执行。
SleepEx扩展了Sleep的功能,在最短超时时间间隔已到的情况下恢复线程执行外,在以下两种情况下发生时也可以恢复执行:I/O完成回调函数被调用、异步过程调用(APC)被安排进入线程中。
 
 
Sleep函数原型:
VOID WINAPI Sleep(
    DWORD dwMillseconds);
 
dwMilliseconds: 指定线程挂起最短时间间隔,以ms为单位。如设为常数INFINITE,表示将一个线程永久性的催眠
返回值:无。
 
SleepEx函数原型:
DWORD WINAPI SleepEx(
    DWORD dwMillesconds,
    BOOL bAlertable);
参数:
dwMilliseconds: 指定线程挂起最短时间间隔,以ms为单位,时间一到不管后面参数如何都会返回,如设为常数INFINITE,表示将一个线程永久性的催眠
bAlertable: 设置为FALSE,那么,在线程挂起期间不会响应。即使一个I/O完成回调函数被调用或有新的APC排进入,他们使函数返回,也不会被执行。//若是 True, 只要有 APC 函数申请, SleepEx 不管第一个参数如何都会把 APC 推入队列并随 APC 函数一起返回.//注意: SetWaitableTimer 和 SleepEx 必须在同一个线程才可以.
如用一个ReadFileEx   或   WriteFileEx函数调用初始化了一个异步I/O传输,而且我们希望函数返回,以便由那些函数指定的I/O结束例程能正常执行,就设为TRUE。
 
返回值:
 Long。返回0表示时间间隔完成,返回WAIT_IO_COMPLETION表示I/O完成回调函数被调用。
 
APC是内核的一种软中断性质的东西,后面那个参数应该是这个意思,如果是false,就算有APC被插入,也要等到等待的时间到了,SleepEX才退出,如果是false,那只要有新的APC被插入了,SleepEx就马上返回了。 其实Windows的内核中Sleep就简单地理解就是线程挂在那里多少时间,不对这个线程调度。CPU的时间片都分配到其他线程中,除非等待时间到了,再继续调度和分配时间片。APC就相当于一个额外的调度。
 
 
 

像谷歌的这段,我也搜索看过

如设为常数INFINITE,表示将一个线程永久性的催眠     UpK软件安全社区3 a2 B: g3 Q/ U2 h7 v' y8 Q) u: Q8 d0 J3 B7 j9 D4 K
  bAlertable   Long,如用一个ReadFileEx   或   WriteFileEx函数调用初始化了一个异步I/O传输,而且我们希望函数返回,以便由那些函数指定的I/O结束例程能正常执行,就设为TRUE$ K6 t; _- A% l6 v% b

是什么意思?当参设为无限时间的时候,调用ReadFileEx后就返回?

不是这个意思,对线程的APC操作一般都是ring0里面搞的,ring3下也可以搞,不过绝对不是你理解的ReadFile什么的函数。+ [' u. N+ k# O  \0 `% A

比如这么说把,搞一个dll的注入,可以用两种方式,一种是用CreateRemoteThread函数(CreateRemoteThread 最后在ring0是否还是调用了插入APC,我没有去了解),另外一种就是直接插入一个APC。
/ n6 M; }# K/ q5 }# p9 u
假设你的线程一直在SleepEx(-1,false),如果这个时候有人想用APC在你的线程里增加一个新的调度,那这个调度是不会被执行的,因为线程在内核里标记为挂起,如果你用SleepEx(-1,True),那会被马上调度这个Apc而且SleepEx函数返回。

Sleep和 SleepEx函数的更多相关文章

  1. 重叠I/O模型

    一. 重叠I/O的概念当调用ReadFile和WriteFile时,如果最后一个参数lpOverlapped设置为NULL,那么线程就阻塞在这里,直到读写完指定的数据后,它们才返回.这样在读写大文件的 ...

  2. 第9章 用内核对象进行线程同步(2)_可等待计时器(WaitableTimer)

    9.4 可等待的计时器内核对象——某个指定的时间或每隔一段时间触发一次 (1)创建可等待计时器:CreateWaitableTimer(使用时应把常量_WIN32_WINNT定义为0x0400) 参数 ...

  3. Windows高精度时间

    目录 第1章计时    1 1.1 GetTickCount    1 1.2 timeGetTime    1 1.3 QueryPerformanceCounter    1 1.4 测试     ...

  4. 套接字I/O模型-重叠I/O

    重叠模型的基本设计原理是让应用程序使用重叠的数据结构,一次投递一个或多个WinsockI/O请求.针对那些提交的请求,在它们完成之后,应用程序可为它们提供服务.模型的总体设计以Windows重叠I/O ...

  5. 深入理解Windows X64调试

    随着64位操作系统的普及,都开始大力进军x64,X64下的调试机制也发生了改变,与x86相比,添加了许多自己的新特性,之前学习了Windows x64的调试机制,这里本着“拿来主义”的原则与大家分享. ...

  6. windows 下文件的高级操作

    本文主要说明在Windows下操作文件的高级方法,比如直接读写磁盘,文件的异步操作,而文件普通的读写方式在网上可以找到一大堆资料,在这也就不再进行专门的说明. 判断文件是否存在 在Windows中并没 ...

  7. windows 线程

    在windows中进程只是一个容器,用于装载系统资源,它并不执行代码,它是系统资源分配的最小单元,而在进程中执行代码的是线程,线程是轻量级的进程,是代码执行的最小单位. 从系统的内核角度看,进程是一个 ...

  8. 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术

    目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...

  9. WinSock 重叠IO模型

    title: WinSock 重叠IO模型 tags: [WinSock 模型, 网络编程, 重叠IO模型] date: 2018-06-29 20:26:13 categories: Windows ...

随机推荐

  1. 开发日记:DotNetCore 批处理 发布

    @echo off@title 中医科院 - 发布@echo ******************************************************@echo ========= ...

  2. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之Windows服务安装

    背景说明 EasyDSS流媒体解决方案是由安徽旭帆信息科技有限公司自主研发的一套集流媒体点播.转码.管理.直播.录像.检索.时移回看于一体的一套完整的商用流媒体解决方案.EasyDSS软件以压缩包的形 ...

  3. rtmp_specification_1.0

    Copyright Adobe Systems Incorporated H. Parmar, Ed. M. Thornburgh, Ed. Adobe December 21, 2012 Adobe ...

  4. 【常用技巧】标准模板库(STL)

    [常用技巧]标准模板库(STL) 在前几个章节中我们已经使用了诸如队列.堆.堆栈.vector 等标准模板库中的模板,切身感受到了它给我们带来的极大便利.在本节中,我们还要介绍两种标准模板——stri ...

  5. PHP匹配中文,匹配车牌号

    /** * 车牌号 * 字母全部大写 * @param $str * @return string */ public static function checkCar($str) { $patter ...

  6. PAT甲级1006水题飘过

    题目分析:由于不存在相同的两个时间(24:00:00和00:00:00不会同时存在),则我们假设两个全局变量存放到达的最早的时间和达到的最晚的时间,设置最早的初值为“23:59:59”,设置最晚的初值 ...

  7. 测试类——python编程从入门到实践

    1.各种断言方法 常用断言方法: 方法 用途 assertEqual(a, b) 核实a == b assertNotEqual(a, b) 核实a != b assertTrue(x) 核实x为Tr ...

  8. C语言环境搭建

    UNIX/Linux 上的安装 如果您使用的是 Linux 或 UNIX,请在命令行使用下面的命令来检查您的系统上是否安装了 GCC: $ gcc -v 如果您的计算机上已经安装了 GNU 编译器,则 ...

  9. golang module 下载外网资源失败解决办法

    用 golang 1.11 module 特性时,需要下载golang.org等外网地址的库文件 可以创建环境变量GOPROXY,使用Aliyun的镜像 go公共代理文档 简介 go module公共 ...

  10. Oracle--(Hierarchical Queries)层级查询(用于部门层级等)

    原网址:https://www.cnblogs.com/guofeiji/p/5291486.html 如果表中包含层级数据,可以使用层级查询子句按层级顺序选择数据行,形成层级树,形式如下: 下面是层 ...