www.pudn.com > myseelite_2007_06_28.zip > CriticalSection.h


/* 
 *  Openmysee 
 * 
 *  This program is free software; you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation; either version 2 of the License, or 
 *  (at your option) any later version. 
 * 
 *  This program is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *  GNU General Public License for more details. 
 * 
 *  You should have received a copy of the GNU General Public License 
 *  along with this program; if not, write to the Free Software 
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 * 
 */ 
// $_FILEHEADER_BEGIN **************************** 
//  
// Copyright (C) Sina Corporation.  All Rights Reserved 
// 文件名称:CriticalSection.h 
// 创建日期:20050404 
// 创建人: 王耿 
// 文件说明:互斥对象 
 
// 0.01 王耿 20050403 
// 创建文件 
// $_FILEHEADER_END ****************************** 
#ifndef __CRISECTION_H 
#define __CRISECTION_H 
 
namespace UC 
{ 
#ifdef WIN32 
     
#include  
     
#else 
     
#include  
#include  
#endif//_XNIX 
     
     
    class CCriticalSection 
    { 
    private: 
        //windows OS 
#ifdef WIN32 
        CRITICAL_SECTION	moSection; 
#else 
        pthread_mutex_t mMutex; 
#endif 
         
         
    public: 
        CCriticalSection() 
        { 
#ifdef WIN32 
            InitializeCriticalSection(&moSection); 
#else 
            mMutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; 
            //pthread_mutex_init(&mMutex,NULL); 
#endif 
        }; 
        ~CCriticalSection() 
        { 
#ifdef WIN32 
            DeleteCriticalSection(&moSection); 
#else 
            pthread_mutex_destory(&mMutex); 
#endif 
        } 
        void  inline Enter() 
        { 
#ifdef WIN32 
            EnterCriticalSection(&moSection); 
#else 
            pthread_mutex_lock(&mMutex); 
#endif 
        } 
        void inline Leave() 
        { 
#ifdef WIN32 
            LeaveCriticalSection(&moSection); 
#else 
            pthread_mutex_unlock(&mMutex); 
#endif 
        }; 
         
    }; 
    class CCriticalSectionHelper 
    { 
    public: 
        CCriticalSectionHelper(CCriticalSection& aCriticalSection) 
            :moCriticalSection(aCriticalSection) 
        { 
            moCriticalSection.Enter(); 
        };	 
        ~CCriticalSectionHelper(){ 
            moCriticalSection.Leave(); 
        } 
    private: 
        CCriticalSection& moCriticalSection; 
    }; 
}; 
#endif // __CRISECTION_H