
/*互斥量C++实现+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ class CMutex
{
public:
CMutex() ;
~CMutex() ; void lock() ;
void unlock() ; private: #ifdef _WIN32
CRITICAL_SECTION cs;
#else
pthread_mutex_t cs;
pthread_mutexattr_t mta ;
#endif
}; #ifdef _WIN32
CMutex::CMutex()
{
InitializeCriticalSection(&cs);
} CMutex::~CMutex()
{
DeleteCriticalSection(&cs);
} void CMutex::lock()
{
EnterCriticalSection(&cs);
} void CMutex::unlock()
{
LeaveCriticalSection(&cs);
}
#else
CMutex::CMutex()
{
pthread_mutexattr_init( &mta ) ;
pthread_mutexattr_settype( &mta , PTHREAD_MUTEX_RECURSIVE_NP ) ;
pthread_mutex_init( &cs , &mta ) ;
} CMutex::~CMutex()
{
pthread_mutexattr_destroy( &mta ) ;
pthread_mutex_destroy(&cs);
} void CMutex::lock()
{
//printf( " lock the %d \r\n" , &cs ) ;
pthread_mutex_lock(&cs);
} void CMutex::unlock()
{
//printf( " unlock the %d \r\n" , &cs ) ;
pthread_mutex_unlock(&cs);
}
#endif /* 例一 内存调试+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//如果定义了内存调试宏
#ifdef DEBUG_MALLOC
CMutex mallocMutex ;
int malloctick = ; //-----------------------------------------------
//对内存分配增加一个计数器,用于调试内存泄露
void *debugMalloc( int size )
{
void *pmem = ;
mallocMutex.lock() ; //malloc次数+1
malloctick ++ ;
pmem = malloc( size ) ; printf( "debugMalloc count = %d\r\n" , malloctick ) ; mallocMutex.unlock() ; return pmem ;
} //-----------------------------------------------
//用于调试内存泄露
void debugFree( void *pmem )
{
mallocMutex.lock() ;
//malloc次数-1
malloctick -- ;
free( pmem ) ;
printf( "debugFree count = %d\r\n" , malloctick ) ;
mallocMutex.unlock() ;
}
#endif //DEBUG_MALLOC /* 例二 自动锁+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*自动锁作用在一个局部,在函数内部,从声明该锁开始,到函数退出时,销毁自动锁时,在析构函数里面调用CMutex::unlock()*/
class CAutoMutex
{
public:
CAutoMutex( CMutex *mutex )
{
m_pmutex = mutex ;
if( m_pmutex )
m_pmutex->lock() ;
} virtual ~CAutoMutex()
{
if( m_pmutex )
{
m_pmutex->unlock() ;
m_pmutex = NULL ;
}
};
private:
CMutex *m_pmutex ;
}; //一个使用自动锁的类
class CNetServer
{
protected:
CNetServer() ;
~CNetServer() ;
DECLARE_SINGLEOBJ( CNetServer )
public:
bool RequestTalkOn( unsigned userid );
protected:
//对讲标志状态
bool m_talkOn ;
int m_talkUserID ;
CMutex m_taklMutex ;
}; //使用示例
bool CNetServer::RequestTalkOn( unsigned userid )
{
CAutoMutex atlck( &m_taklMutex);
m_talkUserID = userid ;
m_talkOn = true ;
NETLIB_PRINTF("request Talkon success userid = %d\r\n" , userid ) ;
return true ;
}
/*THE END, ocj*/