日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程可警告状态以及APC队列

發(fā)布時(shí)間:2024/8/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程可警告状态以及APC队列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自:http://blog.csdn.net/qq_22423659/article/details/53425828

一、線程可警告狀態(tài)的真實(shí)含義

1、通過另一些方法讓線程"暫停"(非SuspendThread方法,比如SleepEx,wait函數(shù)族等),并可以進(jìn)入一種稱之為

Alterable的狀態(tài)(可警告狀態(tài))

2、這種狀態(tài)本質(zhì)上其實(shí)是高速系統(tǒng)調(diào)度程序:當(dāng)前現(xiàn)成的函數(shù)調(diào)用棧以及對應(yīng)的寄存器狀態(tài)可以直接被用來調(diào)用

別的一些函數(shù),一般這種函數(shù)都被稱為異步函數(shù)

3、通常系統(tǒng)會用此線程環(huán)境(理解為函數(shù)調(diào)用器)來調(diào)用一些其他的回調(diào)函數(shù)(比如:IO完成通知,線程的異步調(diào)用隊(duì)列等)

4、這樣借用線程的好處是,系統(tǒng)不必為一些回調(diào)函數(shù)大費(fèi)周折的創(chuàng)建一些新的專用線程,既可以達(dá)到節(jié)約系統(tǒng)資源的目的,

還可以充分發(fā)揮系統(tǒng)性能

5、通常異步函數(shù)最好能夠很快執(zhí)行完,不要做太耗時(shí)的操作,不然真正的線程函數(shù)需要執(zhí)行時(shí),會無法立即執(zhí)行

參考視頻:點(diǎn)擊打開鏈接

二、線程APC隊(duì)列

1、每個(gè)線程可以通過調(diào)用QueueUserAPC函數(shù),明確的創(chuàng)建一個(gè)"異步調(diào)用隊(duì)列"

2、其實(shí)就是為線程在線程函數(shù)調(diào)用棧之外再安排一組函數(shù)去執(zhí)行

3、默認(rèn)情況下,創(chuàng)建線程時(shí)不會創(chuàng)建這個(gè)隊(duì)列,當(dāng)調(diào)用該函數(shù)時(shí),就會為這個(gè)線程創(chuàng)建這個(gè)隊(duì)列

4、創(chuàng)建APC隊(duì)列的函數(shù),一般使用Wait函數(shù)族或者SleepEx函數(shù)等帶有bAlertable參數(shù)的函數(shù)進(jìn)入一種假"暫停"的狀態(tài)

5、進(jìn)入Alertable狀態(tài)的線程,系統(tǒng)調(diào)度器會在線程函數(shù)本身處于"暫停"(等待狀態(tài))時(shí),一次調(diào)用線程APC隊(duì)列中的函數(shù)

6、注意APC隊(duì)列中的函數(shù)不要執(zhí)行事件過長,以免影響線程函數(shù)本身的執(zhí)行

7、需要注意的是,有些函數(shù)雖然也會使線程進(jìn)入等待狀態(tài),但不能進(jìn)入可警告狀態(tài),也即不能調(diào)用異步的函數(shù),比如:

GetMessage函數(shù)等(這些函數(shù)也沒有bAlterable參數(shù))

8、最后也需要注意的是,不要在APC函數(shù)中再調(diào)用讓線程進(jìn)入Alterable狀態(tài)的API,這會引起一個(gè)遞歸,而導(dǎo)致線程棧溢出


[cpp]?view plaincopy
  • /*?
  • 演示了ThreadAlerable如何讓一個(gè)線程進(jìn)入可警告狀態(tài)并去執(zhí)行一個(gè)APC隊(duì)列中的函數(shù)?
  • */??
  • #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函數(shù)??
  • ????for?(int?i?=?0;?i?<?100;?i++)??
  • ????{??
  • ????????QueueUserAPC(APCFunction,GetCurrentThread(),i);//為當(dāng)前線程創(chuàng)建APCFunction的隊(duì)列??
  • ????}??
  • ????//通過SleepEx進(jìn)入"可警告狀態(tài)",注釋后,APC函數(shù)不會被調(diào)用??
  • ????//SleepEx使主線程進(jìn)入等待,執(zhí)行APC函數(shù)??
  • ????SleepEx(10000,TRUE);??
  • ????_tsystem(_T("PAUSE"));??
  • ????return?0;??
  • } ?
  • 總結(jié)

    以上是生活随笔為你收集整理的线程可警告状态以及APC队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。