线程可警告状态以及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 plain  copy
  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. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值