進程
線程
進程、線程的區別
同步
事件
/*
lpEventAttributes 事件的安全級別,設爲NULL爲默認設置
bManualReset 人工置位爲true,自動置位爲false
bInitialState 事件初始化的狀態,有狀態爲true,無狀態爲false
lpName 事件的名稱,設爲NULL則爲匿名
*/
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName);
BOOL SetEvent(HANDLE hEvent);
BOOL ResetEvent(HANDLE hEvent);
信號量
信號量是內核對象,可用於進程間的同步也可用於同一進程中的線程間的同步,用來對資源進行計數。當資源數大於零,信號量處於觸發狀態;當資源是等於零,信號量未觸發。
/*
lpSemaphoreAttributes 信號量的安全屬性,設爲NULL則爲默認設置
lInitialCount 初始資源數,必須大於等於零,小於最大資源數
lMaximumCount 最大資源數
lpName 信號量名稱,設爲NULL則爲匿名信號量
*/
HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName);
打開一個已有信號量
/*
dwDesiredAccess 訪問方式,一般使用SEMAPHORE_ALL_ACCESS
bInheritHandle 繼承特性,一般使用true
lpName 信號量名稱
*/
HANDLE OpenSemaphore(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName);
釋放信號量
/*
hSemaphore 要釋放的信號量句柄
lReleaseCount 釋放的數量,即資源的增加量,必須大於零
lpPreviousCount 原先的計數值,設爲NULL爲不需要傳入
*/
BOOL ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount);
互斥
臨界區
void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); // 初始化臨界區
void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); // 進入臨界區
void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection); // 離開臨界區
void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection); // 刪除臨界區
因爲主線程擁有線程所有權,所以可以重複多次進入臨界區,導致子線程在接受參數之前主線程可能已經修改了參數,而無法實現線程同步。
互斥量
/*
lpMutexAttributes 安全控制,設爲NULL則爲默認設置
bInitialOwner 是否成爲該互斥量的初始擁有者,設爲TRUE爲擁有,互斥量爲無信號狀態;設爲FALSE爲不擁有,該信號量不爲任何線程佔有,互斥量爲有信號狀態
lpName 互斥量名稱
*/
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);
打開互斥量
/*
dwDesiredAccess 訪問方式,一般設爲MUTEX_ALL_ACCESS
bInheritHandle 該進程的子進程能否繼承該互斥量,一般設爲TRUE
lpName 互斥量名稱
*/
HANDLE OpenMutex(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName);
釋放互斥量
BOOL ReleaseMutex(HANDLE hMutex);
互斥量同臨界區一樣,主線程擁有線程控制權,因此同樣不能用於同步。