多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用EnterCriticalSection和LeaveCriticalSection函数
临界区在使用时以CRITICAL_SECTION结构对象保护共享资源,并分别用EnterCriticalSection()和LeaveCriticalSection()函数去标识和释放一个临界区。所用到的CRITICAL_SECTION结构对象必须经过InitializeCriticalSection()的初始化后才能使用,而且必须确保所有线程中的任何试图访问此共享资源的代码都处在此临界区的保护之下。否则临界区将不会起到应有的作用,共享资源依然有被破坏的可能。
DOWRD m_haha; //成员变量
CRITICAL_SECTION m_happy;
InitialzeCriticalSection(&m_happy); //在构造函数中执行
DeleteCritialSection(&m_happy); //在析构函数中执行
//在某个线程中操作该成员变量时,要如下处理:
EnterCriticalSection(&m_happy);
DWORD haha= m_haha++;
LeaveCriticalSection(&m_happy);
每个线程中访问临界资源的那段代码称为临界区(Critical Section)。所以上面的 DWORD happy = m_happy++; 就是临界区啦
其实就是创建临界区对象,使用EnterCriticalSection()进入这个临界区获取这个对象,使用完要LeaveCriticalSection()退出该临界区,这样别的线程才能用。
EnterCriticalSection(&m_happy);
DOWRD happy = m_happy++;
LeaveCritialSection(&m_happy);
EnterCriticalSection(&m_happy);
DOWRD happy = m_happy++;
LeaveCritialSection(&m_happy);
EnterCriticalSection(&m_happy);
DOWRD happy = m_happy++;
LeaveCritialSection(&m_happy);
EnterCriticalSection(&m_happy);
DOWRD happy = m_happy++;
LeaveCritialSection(&m_happy);