临界区域: 简单的说, 是一种多线程数据同步的控制方式。
可以把它想像成一扇门,没人用的时候门是大家先到先进,进去了之后门关上,后面的人排队等前面的人出来才能进入
1. 大家都通过同一扇门用同样的东西EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection),有人在门里,就等待
2. 用完东西后,就出门(LeaveCriticalSection),后面的人又可以进去了。
临界区域控制法并没有保存任何变量,它只是设置了一道门,通过门来控制访问人员。
下面是临界区域锁封装和简单的控制示例:
/*Thread.cpp*/
#include<stdio.h>
#include<process.h>
#include <Windows.h>
#include <conio.h>
//线程同步锁
class CCriticalSectionLock
{
public:
CCriticalSectionLock()
{
InitializeCriticalSection(&m_cs);
}
~CCriticalSectionLock()
{
DeleteCriticalSection(&m_cs);
}
void Lock()
{
EnterCriticalSection(&m_cs);
}
void Unlock()
{
LeaveCriticalSection(&m_cs);
}
private:
CRITICAL_SECTION m_cs;
};
int n_AddValue = 0;
CCriticalSectionLock g_lockAddValue;
void Start1(void *arg)
{
for(int i = 0; i<10; i++){
g_lockAddValue.Lock();
n_AddValue ++;
printf("n_AddValue in 1st is %d\n", n_AddValue);
g_lockAddValue.Unlock();
}
_endthread();
}
void Start2(void *arg)
{
for(int i = 0; i<10; i++){
g_lockAddValue.Lock();
n_AddValue ++;
printf("n_AddValue in 2nd is %d\n", n_AddValue);
g_lockAddValue.Unlock();
}
_endthread();
}
void main()
{
_beginthread(Start1,0,NULL);
_beginthread(Start2,0,NULL);
getch();
}