线程同步之临界区
Windows下有多种线程同步方法,出于安全考虑,程序运行方式划分为用户模式和内核模式,用户模式同步方法有临界区,内核模式同步方法有互斥量、信号量、事件等,用户模式同步速度快,而内核模式同步能提供更多的功能,并且可以指定超时时间,防止产生死锁。
下面介绍临界区的用法,相关API如下:
#include <windows.h>
void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
以下是个简单的例子,经测试,对于同样的数据范围,临界区比互斥量快很多。
#include <windows.h>
#include <process.h>
#include <stdio.h>
#define N 5
CRITICAL_SECTION gCriticalSection;
int tot = 0;
unsigned WINAPI Add(void *arg) {
int i;
for (i = 0; i < 10000; i++) {
EnterCriticalSection(&gCriticalSection);
tot += 1;
LeaveCriticalSection(&gCriticalSection);
}
return 0;
}
int main() {
int idx;
HANDLE hThread[N];
InitializeCriticalSection(&gCriticalSection);
for (idx = 0; idx < N; idx++)
hThread[idx] = (HANDLE)_beginthreadex(NULL, 0, Add, NULL, 0, NULL);
WaitForMultipleObjects(N, hThread, TRUE, INFINITE);
DeleteCriticalSection(&gCriticalSection);
return 0;
}