一个windows临界区类(从同事手上拷贝过来的)

来源:互联网 发布:手机淘宝怎样找同款 编辑:程序博客网 时间:2024/04/29 11:44

 AutoCriticalSection.h


#pragma once

#include <WTypes.h>

/*!
* 自动加锁、解锁的临界区类
*/
class CAutoCriticalSection
{
private :
    CRITICAL_SECTION *m_pCS ;    //!< 临界区对象指针,指向一个需要加锁的临界区对象
public :
    //! 构造函数
    /*!
    * 通过传入一个临界区对象的引用,实现对这个临界区的加锁
    * @param cs 需要加锁的临界区对象,这个对象应该是已经正确的调用了InitializeCriticalSection
    */
    CAutoCriticalSection( CRITICAL_SECTION& cs ) : m_pCS( &cs )
    {
        ::EnterCriticalSection( m_pCS ) ;
    }
    CAutoCriticalSection( PCRITICAL_SECTION pCS ) : m_pCS( pCS )
    {
        if( m_pCS )
        { // 临界区对象有效
            ::EnterCriticalSection( m_pCS ) ;
        }
    }

    //! 析构函数
    /*!
    * 自动解除对传入的临界区的解锁
    */
    ~CAutoCriticalSection()
    {
        if( NULL != m_pCS )
        { // 临界区对象有效
            ::LeaveCriticalSection( m_pCS ) ;
        }
    }
} ;

 

 

 

测试代码:

 

#include <iostream>
#include "AutoCriticalSection.h"

using namespace std;

DWORD WINAPI Fun1Proc(
                      LPVOID lpParameter   // thread data
                      );

DWORD WINAPI Fun2Proc(
                      LPVOID lpParameter   // thread data
                      );

int tickets=100;

CRITICAL_SECTION g_cs;

void main()
{   
    InitializeCriticalSection(&g_cs);

    HANDLE hThread1;
    HANDLE hThread2;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
    CloseHandle(hThread1);
    CloseHandle(hThread2);

    Sleep(400000);

    DeleteCriticalSection(&g_cs);
   
    system("pause");
    return;
}

DWORD WINAPI Fun1Proc(
                      LPVOID lpParameter   // thread data
                      )
{
    while(TRUE)
    {
        CAutoCriticalSection cs( &g_cs ) ;    // 自动锁定服务信息锁       
        if(tickets>0)
        {
            Sleep(1);
            cout<<"thread1 sell ticket : "<<tickets--<<endl;
        }
        else
            break;       
    }

    return 0;
}

DWORD WINAPI Fun2Proc(
                      LPVOID lpParameter   // thread data
                      )
{

    while(TRUE)
    {
        CAutoCriticalSection cs( &g_cs ) ;    // 自动锁定服务信息锁       
        if(tickets>0)
        {
            Sleep(1);
            cout<<"thread2 sell ticket : "<<tickets--<<endl;
        }
        else
            break;       
    }
    cout<<"thread2 is running!"<<endl;
    return 0;
}

原创粉丝点击