C++ 浅说Windows多线程临界区域(Critical Section)

来源:互联网 发布:巨人网络私有化 编辑:程序博客网 时间:2024/06/05 16:06

临界区域: 简单的说, 是一种多线程数据同步的控制方式。

可以把它想像成一扇门,没人用的时候门是大家先到先进,进去了之后门关上,后面的人排队等前面的人出来才能进入

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(); }