Windows核心編程學習筆記(11)--線程調度

Drecik學習經驗分享

轉載請註明出處:http://blog.csdn.net/drecik__/article/details/8091304

 

  • 線程的掛起與恢復

在線程對象中有一個值表示線程的掛起計數,在調用CreateProcess或CreateThread時,系統將創建線程的內核對象,並把掛起計數初始化爲1,因爲線程初始化需要時間,這樣可以防止線程在初始化的時候被執行。

在線程初始化之後,CreateProcess或CreateThread函數會查看是否傳遞CREATE_SUSPENDED標誌,如果沒有則將掛起計數遞減爲0,讓線程可以執行,否則讓線程繼續保持掛起。

線程可以執行ResumeThread函數來遞減掛起計數或者使用SuspendThread函數來遞增掛起計數,但是掛起計數不能超過MAXINMUN_SUSPEND_COUNT(127)個,這兩個函數原型如下,函數返回值都是調用函數之前的掛起計數

DWORD ResumeThread(
	HANDLE hThread		// 線程句柄,注意線程本身不能喚醒自己;
	);

// 使用該函數掛起另一個線程時需要注意不知道該線程在做什麼;
// 例如,當該線程正在分配堆中內存,鎖定完堆之後,被掛起,將不能讓;
// 其他線程使用堆,可能出現死鎖;
DWORD SuspendThread(
	HANDLE hThread		// 線程句柄,線程本身可以掛起自己;
	);
  • 進程的掛起與恢復

Windows中不存在掛起進程的概念,但是可以枚舉進程中所有線程來使進程中線程全部掛起或恢復

  • 線程睡眠

使用Sleep函數可以休眠自己,傳入的參數是休眠的時間,Sleep函數有以下注意:

  1. 調用Sleep函數,將使線程資源放棄屬於它的時間片中剩下部分
  2. 傳入的時間只是近似值,因爲Windows不是實時操作系統,取決於其他線程運行情況
  3. 當傳入INFINITE,將使該線程永遠不會調度,但這樣做沒意義,沒有是線程直接退出好
  4. 傳入0,表示該線程自願放棄時間片,將CPU留給其他線程,當有相同或者較高優先級的線程則會調用那個線程,否則繼續調用該線程
  • 切換到另一個線程

使用SwitchToThread可以是該線程放棄時間片,調度其他線程,與Sleep傳入0函數不同的是,該函數可以調度優先級比它小的線程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章