线程可警告状态以及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
總結
以上是生活随笔為你收集整理的线程可警告状态以及APC队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vim配置vimrc详解
- 下一篇: JanusGraph(HugeGraph