線程與內核對象的同步-2

等待定時器內核事件
CreateWaitableTimer(
PSECURITY_ATTRIBUTES psa,
BOOL fManualReset,
PCTSTR pszName);
進程能夠得到它本身的與進程相關的現有等待定時器的句柄。
HANDLE OpenWaitableTimer(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
PCTSTR pszName);

等待定時器對象老是在未通知狀態中建立,必須調用SetWaitableTimer函數來告訴定時器你想在什麼時候讓
它成爲已通知態。
BOOL SetWaitableTimer(
HANDLE hTimer, //定時器
const LARGE_INTEGER *pDueTime, //pDueTime和lPeriod 一道使用,用於指明定時器什麼時候應該第一次報時
LONG lPeriod,//指明定時器應該多長時間報時一次
PTIMERAPCROUTINE pfnCompletionRoutine,
PVOID pvArgToCompletionRoutine,
BOOL fResume);

FILETIME和LARGE_INTEGER
FILETIME 從32位的邊界開始。
LARGE_INTEGER從64位邊界開始。
系統移值要考慮對齊的問題。

讓等待定時器給APC排隊。

信標內核對象
若是當前資源數量大於0,則發出信標信號。
若是當前資源數量是0,則不發出信標信號。
系統毫不容許當前資源的數量爲負值。
當前資源的數量決不能大於最大資源數量。
不要把信標的使用數量與它的當前資源數量混爲一談。
HANDLE CreateSemphore(
PSECURITY_ATTRIBUTE psa,
LONG lInitialCount,
LONG lMaximumCount,
PCTSTR pszName);

HANDLE OpenSemaphore(
DWORD fdwAccess,
BOOL bInHeritHandle,
PCTSTR pszName);

ReleaseSemaphore(
HANDLE hsem,
LONG lReleaseCount,
PLONG plPreviousCount)

信標可以以原子操做方式來執行測試和設置操做。 至關於relase 使數量+1,而成功地等待信標的反作用是它的數量遞減 1

互斥對象內核對象
互斥對象包含一個使用數量,線程ID和一個遞歸計數器。
互斥對象比關鍵代碼要慢(前者是內核對象)但能夠跨進程

規則:
若是線程ID是0,互斥對象不被任何線程擁有,併發出該互斥對象的通知信號。
若是ID是一個非0數字,那麼一個線程就擁有互斥對象,而且不發出該互斥對象的通知信號。
與全部其餘內核對象不一樣,互斥對象在操做系統中擁有特殊的代碼,容許它們違反正常規則。
HANDLE CreateMutex(
PSECURITY_ATTRIBUTES psa,
BOOL fInitialOwner,
PCTSTR pszName);
經過OpenMutex,另外一個進程能夠得到它本身進程與現有互斥對象相關的句柄
HANDLE OpenMutex(
DWORD fdwAccess,
BOOL bInheritHandle,
PCTSTR pszName);

fInitialOwner 控制互斥對象的初始狀態,若是設爲true,那麼線程ID被設爲調用線程ID,遞歸計數器被設1.
若是是false,線程ID和遞歸計數器都設置爲0,這意味着互斥對象沒有被任何線程所擁有,所以發出它的通知信號。

經過調用一個等待函數,並傳遞一個負責保護資源的互斥對象句柄,線程就可以得到對共享資源的訪問權。
在內部,等待函數要檢查線程的ID,以瞭解它是不是0,若是線程ID是0,那麼該線程ID被設置爲調用線程ID,
遞歸計數設置爲1,同時,調用線程保持可調度狀態。
若是等待函數發現ID不是0,那麼調用線程進入等待狀態,系統將記住這個狀況,而且在互斥對象的ID重
置爲0時,將線程ID設置爲等待線程ID,將遞歸計數器設置爲1,而且容許等待線程再次成爲可調度線程。
檢查和修改都是原子方式進行的。
特殊狀況,一個線程試圖等待一個未通知的互斥對象,系統查看申請線程ID和互斥對象中記錄的線程ID
相同,即便互斥對象處於未通知態,系統也容許線程保持可調度狀態。遞歸計數器加1.

BOOL RelaseMutex(HANDLE hUmtex);
遞歸計數器減一,當遞歸計數器爲0,線程ID重置0,同時對象變爲已通知狀態。

釋放的時候也要查看線程ID是否相同。
當釋放對象以前,擁有互斥對象的線程被終止了,那麼系統把該互斥對象視爲已經被放棄,
從新初始化。
不一樣的是等待函數獲得的返回值不是WAIT_OBJECT_0 而是,WAIT_ABANDONED.
併發

 

相關文章
相關標籤/搜索