您的位置:首页 > 编程语言 > C语言/C++

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

2013-10-31 15:12 375 查看
临界区域: 简单的说, 是一种多线程数据同步的控制方式。

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

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();
 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 多线程 临界区域