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. powershell 开windows 端口

    @echo off @echo 请以管理员身份运行 set /p portRemark=请输入端口备注: set /p port=请输入端口号: powershell -command "N ...

  2. Flask 学习(三)路由介绍

    Flask路由规则都是基于Werkzeug的路由模块的,它还提供了很多强大的功能. 两种添加路由的方式 方式一: @app.route('/xxxx') # @decorator def index( ...

  3. Selenium-PO设计模式

    先来一张图,看看整个Po架构的实现: operatePages:操作页面,也就是把每一个操作页面,写成一个类. pages:用来存放公共配置文件的一个目录.比如基础类,后续所有类都会用到基础类. re ...

  4. TELNET可以连通但无法创建数据库连接(Oracle)

    问题描述: 近期客户方进行了网络调整,申请A服务器的1521端口开通后,telnet可以访问,但是SQLPLUS.PLSQL等工具一直无法创建相应连接,提示连接超时. 问题排查: 对开放端口的所有服务 ...

  5. 【NPDP笔记】第五章 工具与度量

      5.1 创意工具 Ideation 创意开发 创意工具 Scamper Substitute Combine Adapter Modify Put to another use Eliminate ...

  6. GO语言 文件操作实例

    package main import ( "bufio" "fmt" "io/ioutil" "os" ) func ...

  7. Windows Server 2008 R2怎样设置自动登陆(登录)

    方法一: 打开电脑“菜单”,右键点击“运行”,在对话框输入“control userpasswords2”,点击“确定”. 弹出的窗口取消勾选“要使用本机用户必须输入用户名和密码”,取消后点击“确定” ...

  8. python安装 错误 “User installations are disabled via policy on the machine”

    解决方法一:  1.在运行里输入 gpedit.msc  2.计算机配置管理>>管理模板>>windows组件>>windows Installer>> ...

  9. Sublime Text3 搭建前端开发环境

    第一步:百度搜索sublime text3 ,直接点击红色箭头下方的下载地址,下载完成安装后会提示是否更新,直接点击更新就好了! 第二步:下载插件管理器,点击菜单栏Tools->Package ...

  10. netty的reactor模式

    reactor中包含5个核心结构,那么从操作系统低层次的调度来看5部分是这样的. (1)Handle(句柄资源描述符)本质是对客户端连接上来以后发生事件的处理机制,比如连接成功,读取数据,发送数据等状 ...