windows核心編程9筆記

在進程內核對象的內部有一個布爾變量,當系統創建內核對象的時候會把這個變量的值初始化爲FALSE(未觸發)。當進程終止的時候,操作系統會自動把相應的內核對象中的這個布爾值設爲TRUE,表示該對象已經被觸發。
線程內核對象也遵循同樣的規則,與進程內核對象相同,線程內核對象絕對不可能回到未觸發狀態。

Windows提供了專門用來幫助我們進行線程同步的內核對象:事件、可等待計時器、信號量以及互斥量。

DWORD dw = WaitForSingleObject(hProcess, 5000);
switch(dw)
{
	case WAIT_OBJECT_0:
		//...
		break;
	case WAIT_TIMEOUT:
		//...
		break;
	case WAIT_FAILED:
		//...
		break;
}

有兩種不同類型的事件對象:手動重置事件和自動重置事件。當一個手動重置事件被觸發的時候,正在等待該事件的所有線程都將變成可調度狀態。而當一個自動重置事件被觸發的時候,只有一個正在等待該事件的線程會變成可調度狀態。

事件最通常的用途是,讓一個線程執行初始化工作,然後再觸發另一個線程,讓它執行剩餘的工作。

HANDLE CreateEvent(
	PSECURITY_ATTRIBUTES psa,
	BOOL bManualReset,
	BOOL bInitialState,
	PCTSTR pszName);
當調用SetEvent的時候,我們把事件變成觸發狀態。
當調用ResetEvent的時候,我們把事件變成未觸發狀態。

Microsoft爲自動重置事件定義了一個等待成功所引起的副作用:當線程成功等到自動重置事件對象的時候,對象會自動地重置爲未觸發狀態。這也正是自動重置對象名字的由來。對自動重置對象來說,通常不需要調用ResetEvent,這是因爲系統會自動將事件重置。相反,Microsoft並沒有爲手動重置對象定義一個等待成功所引起的副作用。

信號量內核對象用來對資源進行計數。與其他所有內核對象相同,它們也包含一個使用計數,但它們還包含另外兩個32位值:一個最大資源計數和一個當前資源計數。最大資源計數表示信號量可以控制的最大資源數量,當前資源計數表示信號量當前可用資源的數量。

如果當前資源計數大於0,那麼信號量處於觸發狀態,如果當前資源計數等於0,那麼信號量處於未觸發狀態。

HANDLE CreateSemaphore(
	PSECURITY_ATTRIBUTE psa,
	LONG lInitialCount,
	LONG lMaximumCount,
	PCTSTR pszName);
BOOL ReleaseSemaphore(
	HANDLE hSemaphore,
	LONG lReleaseCount,
	PLONG plPreviousCount);

互斥量內核對象用來確保一個線程獨佔對一個資源的訪問。互斥量與關鍵段的行爲完全相同。但是互斥量是內核對象,而關鍵段是用戶模式下的同步對象。這意味着互斥量比關鍵段慢。但這同時意味着不同進程中的線程可以訪問同一個互斥量,這還意味着線程可以在等待對資源的訪問權時指定一個最長等待時間。

CreateMutex ReleaseMutex

創建窗口的線程和執行用戶界面相關的任務的線程不應該使用WaitForMultipleObjects,而應該使用MsgWaitForMultipleObjectsEx.這是因爲前者會妨礙線程對用戶在用戶界面上的操作進行響應.

異步設備I/O
異步設備I/O允許線程開始讀取操作或寫入操作,但不必等待讀取操作或寫入操作完成。例如:當系統在載入文件的時候,線程可以忙着執行其他任務--創建窗口,初始化數據結構,等等。當初始化完成之後,線程可以將自己掛起,等系統通知它文件已經載入完畢。


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