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