1、線程同步常用的四種鎖
Event(事件)、Mutex(互斥量)、CrititicalSection(臨界區)、Semaphore(信號量)
2、四種鎖的區別
1> Event是一個允許一個線程在某種情況發生時,喚醒另外一個線程的同步對象;
2> Mutex與CrititicalSection很像,Mutex與CrititicalSection的不同在於:Mutex可以在進程間使用,而CrititicalSection只能在同一進程的各線程間使用。當然,Mutex也可以用於同一進程的各個線程間,但是在這種情況下,使用CrititicalSection會更節省系統資源,更有效率;3> 當多個線程訪問一個獨佔性共享資源時,可以使用CrititicalSection;
4> 當需要一個計數器來限制可以使用某個線程的數目時,可以使用Semaphore對象。
3、四種鎖的使用方法
1> event使用方法演示
HANDLE event = CreateEvent(NULL, TRUE, TRUE, "test"); // 第二個參數表示手動或自己重置事件,第三個參數表示事件的初始狀態
WaitForSingleObject(event , 2000); // 在需要等待事件觸發的地方(其他線程等)用此函數,第二個參數是等待時間,爲INFINITE時會一直等下去
SetEvent(event); // 觸發事件
ResetEvent(event); // 重置事件
CloseHandle(event); // 銷燬事件對象
2> Mutex使用方法演示HANDLE mutex = CreateMutex(NULL, FALSE,NULL); // 第二個參數表示初始時是否佔用
WaitForSingleObject(mutex, INFINITE); // 等待佔用方釋放
ReleaseMutex(mutex); // 釋放佔用
CloseHandle(mutex); // 銷燬
3> CrititicalSection使用方法演示
CRITICAL_SECTION cs;
InitializeCriticalSection(&cs); // 初始化
EnterCriticalSection(&cs);
/*******************/
// 需要保護的代碼段
/*******************/
LeaveCriticalSection(&cs);
DeleteCriticalSection(&cs); // 銷燬
4> Semaphore使用方法演示HANDLE semaphore = CreateSemaphore(NULL, 10, 12, NULL); // 初始化
WaitForSingleObject(semaphore, 0L); // 等待
ReleaseSemaphore(semaphore, 1, NULL); // 信號量+1
CloseHandle(semaphore); // 銷燬