线程可警告状态以及APC队列
转自:http://blog.csdn.net/qq_22423659/article/details/53425828
一、线程可警告状态的真实含义
1、通过另一些方法让线程"暂停"(非SuspendThread方法,比如SleepEx,wait函数族等),并可以进入一种称之为
Alterable的状态(可警告状态)
2、这种状态本质上其实是高速系统调度程序:当前现成的函数调用栈以及对应的寄存器状态可以直接被用来调用
别的一些函数,一般这种函数都被称为异步函数
3、通常系统会用此线程环境(理解为函数调用器)来调用一些其他的回调函数(比如:IO完成通知,线程的异步调用队列等)
4、这样借用线程的好处是,系统不必为一些回调函数大费周折的创建一些新的专用线程,既可以达到节约系统资源的目的,
还可以充分发挥系统性能
5、通常异步函数最好能够很快执行完,不要做太耗时的操作,不然真正的线程函数需要执行时,会无法立即执行
参考视频:点击打开链接
二、线程APC队列
1、每个线程可以通过调用QueueUserAPC函数,明确的创建一个"异步调用队列"
2、其实就是为线程在线程函数调用栈之外再安排一组函数去执行
3、默认情况下,创建线程时不会创建这个队列,当调用该函数时,就会为这个线程创建这个队列
4、创建APC队列的函数,一般使用Wait函数族或者SleepEx函数等带有bAlertable参数的函数进入一种假"暂停"的状态
5、进入Alertable状态的线程,系统调度器会在线程函数本身处于"暂停"(等待状态)时,一次调用线程APC队列中的函数
6、注意APC队列中的函数不要执行事件过长,以免影响线程函数本身的执行
7、需要注意的是,有些函数虽然也会使线程进入等待状态,但不能进入可警告状态,也即不能调用异步的函数,比如:
GetMessage函数等(这些函数也没有bAlterable参数)
8、最后也需要注意的是,不要在APC函数中再调用让线程进入Alterable状态的API,这会引起一个递归,而导致线程栈溢出
- /*
- 演示了ThreadAlerable如何让一个线程进入可警告状态并去执行一个APC队列中的函数
- */
- #include<windows.h>
- #include<tchar.h>
- #include<strsafe.h>
- #define GRS_USEPRINTF() TCHAR pBuf[1024]={}
- #define GRS_PRINTF(...)\
- StringCchPrintf(pBuf, 1024, __VA_ARGS__); \
- WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), pBuf, lstrlen(pBuf), NULL, NULL);
- void CALLBACK APCFunction(ULONG_PTR dwParam)
- {
- int i = dwParam;
- GRS_USEPRINTF();
- GRS_PRINTF(_T("%d APC Function Run!\n"),i);
- Sleep(20);
- }
- int _tmain()
- {
- //为主线程添加APC函数
- for (int i = 0; i < 100; i++)
- {
- QueueUserAPC(APCFunction,GetCurrentThread(),i);//为当前线程创建APCFunction的队列
- }
- //通过SleepEx进入"可警告状态",注释后,APC函数不会被调用
- //SleepEx使主线程进入等待,执行APC函数
- SleepEx(10000,TRUE);
- _tsystem(_T("PAUSE"));
- return 0;
- }
线程可警告状态以及APC队列相关推荐
- (72)进程挂靠(attach)使用备用APC队列 SavedApcState 保存父进程 APC 队列,分析 NtReadVirtualMemory
一.回顾 上次课我们学习了 _KAPC_STATE , _KAPC 结构,分析了 TerminateThread 函数最终如何通过插入 APC 的方式来通知目标线程终止. 这次课我们来学习备用APC队 ...
- Windows APC学习笔记(一)—— APC的本质备用APC队列
Windows APC学习笔记(一)-- APC的本质&备用APC队列 基础知识 APC的本质 APC队列 APC结构 分析 KiServiceExit 总结 备用APC队列 挂靠环境下Apc ...
- 面试:为什么 Java 线程没有Running状态?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | my.oschina.net/goldenshaw/bl ...
- 为什么 Java 线程没有 Running 状态?一下被问懵!
什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNNABLE状态? Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状 ...
- 线程五种状态(新建、就绪、运行、阻塞、死亡)
线程的5种状态: 每个 Java 程序都有一个缺省的主线程,对于 Java 应用程序,主线程是 main()方法执行的线索: 对于 Applet 程序,主线程是指挥浏览器加载并执行 Java Appl ...
- 为什么 Java 线程没有 Running 状态?
Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态: 什么 ...
- (71)APC队列,KAPC结构,分析 TerminateThread ,QueueUserApc
一.线程是如何结束的 首先,线程是自己结束的,线程不能被其他线程杀死,考虑一种极端情况,线程屏蔽了时钟中断,不发生异常,那么它就能一直执行下去. TerminateThread 函数结束其他线程的方式 ...
- 面试官问:为什么 Java 线程没有 Running 状态?我懵了
转载自 面试官问:为什么 Java 线程没有 Running 状态?我懵了 什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNN ...
- java 切换panel会闪烁_【19期】为什么Java线程没有Running状态?
Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态: 什么 ...
最新文章
- Oracle常用傻瓜问题1000问
- java导入自定义类_导入自定义Java类
- spring AOP编程
- go 公众号 关注 监听_荐号丨推荐五个适合法学院关注公众号
- ACE入门---很好的文章
- androidid什么时候会变_今天是“三九”为什么老话说:三九冰上走一走,过年也能露一手!...
- Boost:parallel grep测试程序
- ASP.NET_读写Cookie
- sublime text 3 前端开发常用插件
- 想学好C语言?先把基础打好再说吧!
- 【数据校验杂谈】循环冗余检验 (CRC) 算法原理
- docker 启动时指定需要绑定的网卡_Docker容器网络-基础篇
- directshow-faac编码
- 在线文本差集计算工具
- android书籍和教程推荐--不断更新
- Labview 中的类
- 拓端tecdat|python在Scikit-learn中用决策树和随机森林预测NBA获胜者
- PMP课程笔记:第5章 项目范围管理
- HTML 与 microsoftOffice word中字体对照表
- Python滑块验证码之腾讯防水墙简单测试版
热门文章
- python次方运算_neg__python 魔术方法1 运算符重载
- 2017c语言考核册答案,2017年电大《C语言程序设计》形成性考核册答案.doc
- android 左移动画_android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上...
- mysql bug_MySQL 记一次 Bug发现过程
- 【总结记录】面向对象设计OOP三大特性(封装、继承、多态)、七大基本原则的理解(结合代码、现实实例理解)
- 微型计算机惠普1hm20av,微型计算机原理及应用(答案).doc
- linux没有usr目录_了解linux系统目录,sys,tmp,usr,var!
- el-drawer点击的时候为什么有边框_剪映教学之视频拍摄加剪辑【一】:出视频上下黑色边框模糊效果,视频广告配音...
- matlab怎么重新打开新的代码,方程求解程序代码求助-程序代码修改或新的代码...
- python绘制3d坐标轴_matplotlib在python上绘制3D散点图实例详解