线程可警告状态以及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,这会引起一个递归,而导致线程栈溢出


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构实验之链表三:链表的逆置

Problem Description 输入多个整数&#xff0c;以-1作为结束标志&#xff0c;顺序建立一个带头结点的单链表&#xff0c;之后对该单链表的数据进行逆置&#xff0c;并输出逆置后的单链表数据。Input 输入多个整数&#xff0c;以-1作为结束标志。Output 输出逆置后的单链表数据。…

DBUtils使用详细示例(转载)

https://www.cnblogs.com/smyhvae/p/4085684.html

APC异步过程调用

转自&#xff1a;http://blog.sina.com.cn/s/blog_c2ef450f010192hx.html APC 异步过程调用 记得第一次看见这个名词的时候&#xff0c;觉得云里雾罩&#xff0c;然而上网看了下它的介绍&#xff0c;感觉说的都是没头没脑的 然而今天&#xff0c;我再次接触了它&#xff0c;我将…

张小龙:如何把产品做简单

今天从一个小故事开始讲&#xff1a;为什么苹果的手机只有一个按钮&#xff1f; &#xff08;台下&#xff1a;我觉得对于用户来说&#xff0c;只有一个按钮不会有太多的干扰&#xff0c;只要从这里开始&#xff0c;其它的菜单都在这里面了&#xff0c;这是我个人的一些想法。&…

数据结构实验之链表九:双向链表

Problem Description 学会了单向链表&#xff0c;我们又多了一种解决问题的能力&#xff0c;单链表利用一个指针就能在内存中找到下一个位置&#xff0c;这是一个不会轻易断裂的链。但单链表有一个弱点——不能回指。比如在链表中有两个节点A,B&#xff0c;他们的关系是B是A的后…

不敢死队问题

Problem Description 说到“敢死队”&#xff0c;大家不要以为我来介绍电影了&#xff0c;因为数据结构里真有这么道程序设计题目&#xff0c;原题如下&#xff1a; 有M个敢死队员要炸掉敌人的一个碉堡&#xff0c;谁都不想去&#xff0c;排长决定用轮回数数的办法来决定哪个战…

槽边往事

http://chuansong.me/account/bitsea?start12

数据结构实验之链表五:单链表的拆分

Problem Description 输入N个整数顺序建立一个单链表&#xff0c;将该单链表拆分成两个子链表&#xff0c;第一个子链表存放了所有的偶数&#xff0c;第二个子链表存放了所有的奇数。两个子链表中数据的相对次序与原链表一致。Input 第一行输入整数N;&#xff1b; 第二行依次输…

聊天机器人调用API实现

后端调用API&#xff1a; package com.mychat.servlet;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder;…

Dump文件

1. Dump文件 1. Dump文件介绍 Dump文件(Dump File)&#xff0c;也叫转储文件&#xff0c;以.DMP为文件后缀。dump文件是进程在内存中的镜像文件&#xff0c;通过转换然后存储成以.DMP后缀的文件。dump文件根据存储时的选项不同&#xff0c;会生成不同大小的文件&#xff0c;其中…

整理音乐

Problem Description 请用链表完成下面题目要求。 xiaobai 很喜欢音乐&#xff0c;几年来一直在收集好听的专辑。他有个习惯&#xff0c;每次在听完一首音乐后会给这首音乐打分&#xff0c;而且会隔一段时间给打好分的音乐排一个名次。今天 xiaobai 打开自己的音乐文件夹&#…

VS2013正在等待所需操作完成

在用VS2013打开解决方案的时候&#xff0c;遇到”正在等待所需操作完成 &#xff0c;此对话框将在操作完成后关闭“一直弹出显示&#xff0c;解决方案无法加载的情况&#xff01;此时需要将与解决方案名字相同的文件全部相同&#xff08;除解决方案文件除外&#xff09;全部删除…

web聊天室实现

后端&#xff1a; package com.jsx.chat;import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.OnClose; imp…

QPSQL driver not loaded

在用qt连接postgreSQL数据库时&#xff0c;出现驱动无法加载的情况&#xff0c;如下图&#xff1a; 代码&#xff1a;mPgDataBase QSqlDatabase::addDatabase("QPSQL"); 如下如下错误&#xff1a; 解决方案&#xff1a; 网上下载”libpq.dll文件“拷贝至运行文件…

一对一聊天ajax实现

前端页面&#xff1a; 好友列表&#xff1a; 好友列表代码&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <% page import"java.util.Random" %> <% taglib ur…

选票统计

Problem Description 某校学生会主席由全校学生投票选举产生&#xff0c;共有&#xff4d;名候选人报名参选&#xff0c;编号为1到&#xff4d;&#xff08;0&#xff1c;&#xff4d;&#xff1c;1000&#xff09;&#xff0c;全校有&#xff4e;名学生&#xff08;0&#xff…

“模块计算机类型“x64”与目标计算机类型“X86”冲突解决方案

最近在编译一款开源软件的时候&#xff0c;遇到了“模块计算机类型“x64”与目标计算机类型“X86”冲突的问题&#xff0c;网上查了好多资料&#xff0c;都是配置“链接器-》高级-》目标计算机”和选择X64平台编译器&#xff0c;可是怎么试都不行&#xff0c;最后发现是“命令行…

通用的websocket模板代码

web聊天室后端代码模板: package com.jsx.chat;import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.OnClos…