线程可警告状态以及APC队列
轉(zhuǎn)自:http://blog.csdn.net/qq_22423659/article/details/53425828
一、線程可警告狀態(tài)的真實含義
1、通過另一些方法讓線程"暫停"(非SuspendThread方法,比如SleepEx,wait函數(shù)族等),并可以進(jìn)入一種稱之為
Alterable的狀態(tài)(可警告狀態(tài))
2、這種狀態(tài)本質(zhì)上其實是高速系統(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)用隊列等)
4、這樣借用線程的好處是,系統(tǒng)不必為一些回調(diào)函數(shù)大費(fèi)周折的創(chuàng)建一些新的專用線程,既可以達(dá)到節(jié)約系統(tǒng)資源的目的,
還可以充分發(fā)揮系統(tǒng)性能
5、通常異步函數(shù)最好能夠很快執(zhí)行完,不要做太耗時的操作,不然真正的線程函數(shù)需要執(zhí)行時,會無法立即執(zhí)行
參考視頻:點擊打開鏈接
二、線程APC隊列
1、每個線程可以通過調(diào)用QueueUserAPC函數(shù),明確的創(chuàng)建一個"異步調(diào)用隊列"
2、其實就是為線程在線程函數(shù)調(diào)用棧之外再安排一組函數(shù)去執(zhí)行
3、默認(rèn)情況下,創(chuàng)建線程時不會創(chuàng)建這個隊列,當(dāng)調(diào)用該函數(shù)時,就會為這個線程創(chuàng)建這個隊列
4、創(chuàng)建APC隊列的函數(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))時,一次調(diào)用線程APC隊列中的函數(shù)
6、注意APC隊列中的函數(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,這會引起一個遞歸,而導(dǎo)致線程棧溢出
[cpp]?view plaincopy
總結(jié)
以上是生活随笔為你收集整理的线程可警告状态以及APC队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vim配置vimrc详解
- 下一篇: vim的强大,vim设置和插件的使用,脱