用临界区处理多线程数据

临界区

   保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线 程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。

简单使用

#include <Windows.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>

#define THREADCOUNT 4					//声明一个宏,指定线程的数量
int NUM = 0;						//声明一个全局变量
CRITICAL_SECTION cs;					//声明一个全局的临界区

DWORD WINAPI addNum(PVOID *p)
{
	EnterCriticalSection(&cs);			//进入临界区
	for (int i = 0; i < 100; i++)
	{
		NUM++;
	}
	LeaveCriticalSection(&cs);			//离开临界区
}

int main(int argc, char *agv[])
{
	InitializeCriticalSection(&cs);		        //初始化临界区
	HANDLE hd[THREADCOUNT];
	for (int i = 0; i < THREADCOUNT; i++)
	{
		hd[i] = CreateThread(NULL, 0, addNum, NULL, 0, NULL);		//创建线程,调用addNum函数
	}
	WaitForMultipleObjects(THREADCOUNT, hd, TRUE, INFINITE);		//等待创建的所有线程结束
	DeleteCriticalSection(&cs);						//移除临界区
	printf("NUM=%d\n", NUM);
	for (int i = 0; i < THREADCOUNT; i++)
	{
		CloseHandle(hd[i]);						//关闭线程
	}
	system("pause");
	return 0;
}

注意事项

  使用临界区,要注意线程数量不能超过64个

秋风 2016-07-02