Windows線程同步常用鎖的分析

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); // 銷燬

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