转自: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,这会引起一个递归,而导致线程栈溢出

[cpp] view plaincopy
  1. /*
  2. 演示了ThreadAlerable如何让一个线程进入可警告状态并去执行一个APC队列中的函数
  3. */
  4. #include<windows.h>
  5. #include<tchar.h>
  6. #include<strsafe.h>
  7. #define GRS_USEPRINTF() TCHAR pBuf[1024]={}
  8. #define GRS_PRINTF(...)\
  9. StringCchPrintf(pBuf, 1024, __VA_ARGS__); \
  10. WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), pBuf, lstrlen(pBuf), NULL, NULL);
  11. void CALLBACK APCFunction(ULONG_PTR dwParam)
  12. {
  13. int i = dwParam;
  14. GRS_USEPRINTF();
  15. GRS_PRINTF(_T("%d APC Function Run!\n"),i);
  16. Sleep(20);
  17. }
  18. int _tmain()
  19. {
  20. //为主线程添加APC函数
  21. for (int i = 0; i < 100; i++)
  22. {
  23. QueueUserAPC(APCFunction,GetCurrentThread(),i);//为当前线程创建APCFunction的队列
  24. }
  25. //通过SleepEx进入"可警告状态",注释后,APC函数不会被调用
  26. //SleepEx使主线程进入等待,执行APC函数
  27. SleepEx(10000,TRUE);
  28. _tsystem(_T("PAUSE"));
  29. return 0;
  30. }

线程可警告状态以及APC队列相关推荐

  1. (72)进程挂靠(attach)使用备用APC队列 SavedApcState 保存父进程 APC 队列,分析 NtReadVirtualMemory

    一.回顾 上次课我们学习了 _KAPC_STATE , _KAPC 结构,分析了 TerminateThread 函数最终如何通过插入 APC 的方式来通知目标线程终止. 这次课我们来学习备用APC队 ...

  2. Windows APC学习笔记(一)—— APC的本质备用APC队列

    Windows APC学习笔记(一)-- APC的本质&备用APC队列 基础知识 APC的本质 APC队列 APC结构 分析 KiServiceExit 总结 备用APC队列 挂靠环境下Apc ...

  3. 面试:为什么 Java 线程没有Running状态?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | my.oschina.net/goldenshaw/bl ...

  4. 为什么 Java 线程没有 Running 状态?一下被问懵!

    什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNNABLE状态? Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状 ...

  5. 线程五种状态(新建、就绪、运行、阻塞、死亡)

    线程的5种状态: 每个 Java 程序都有一个缺省的主线程,对于 Java 应用程序,主线程是 main()方法执行的线索: 对于 Applet 程序,主线程是指挥浏览器加载并执行 Java Appl ...

  6. 为什么 Java 线程没有 Running 状态?

    Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态: 什么 ...

  7. (71)APC队列,KAPC结构,分析 TerminateThread ,QueueUserApc

    一.线程是如何结束的 首先,线程是自己结束的,线程不能被其他线程杀死,考虑一种极端情况,线程屏蔽了时钟中断,不发生异常,那么它就能一直执行下去. TerminateThread 函数结束其他线程的方式 ...

  8. 面试官问:为什么 Java 线程没有 Running 状态?我懵了

    转载自 面试官问:为什么 Java 线程没有 Running 状态?我懵了 什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNN ...

  9. java 切换panel会闪烁_【19期】为什么Java线程没有Running状态?

    Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态: 什么 ...

最新文章

  1. Oracle常用傻瓜问题1000问
  2. java导入自定义类_导入自定义Java类
  3. spring AOP编程
  4. go 公众号 关注 监听_荐号丨推荐五个适合法学院关注公众号
  5. ACE入门---很好的文章
  6. androidid什么时候会变_今天是“三九”为什么老话说:三九冰上走一走,过年也能露一手!...
  7. Boost:parallel grep测试程序
  8. ASP.NET_读写Cookie
  9. sublime text 3 前端开发常用插件
  10. 想学好C语言?先把基础打好再说吧!
  11. 【数据校验杂谈】循环冗余检验 (CRC) 算法原理
  12. docker 启动时指定需要绑定的网卡_Docker容器网络-基础篇
  13. directshow-faac编码
  14. 在线文本差集计算工具
  15. android书籍和教程推荐--不断更新
  16. Labview 中的类
  17. 拓端tecdat|python在Scikit-learn中用决策树和随机森林预测NBA获胜者
  18. PMP课程笔记:第5章 项目范围管理
  19. HTML 与 microsoftOffice word中字体对照表
  20. Python滑块验证码之腾讯防水墙简单测试版

热门文章

  1. python次方运算_neg__python 魔术方法1 运算符重载
  2. 2017c语言考核册答案,2017年电大《C语言程序设计》形成性考核册答案.doc
  3. android 左移动画_android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上...
  4. mysql bug_MySQL 记一次 Bug发现过程
  5. 【总结记录】面向对象设计OOP三大特性(封装、继承、多态)、七大基本原则的理解(结合代码、现实实例理解)
  6. 微型计算机惠普1hm20av,微型计算机原理及应用(答案).doc
  7. linux没有usr目录_了解linux系统目录,sys,tmp,usr,var!
  8. el-drawer点击的时候为什么有边框_剪映教学之视频拍摄加剪辑【一】:出视频上下黑色边框模糊效果,视频广告配音...
  9. matlab怎么重新打开新的代码,方程求解程序代码求助-程序代码修改或新的代码...
  10. python绘制3d坐标轴_matplotlib在python上绘制3D散点图实例详解