/*互斥量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 = 0 ;
//-----------------------------------------------
//对内存分配增加一个计数器,用于调试内存泄露
void *debugMalloc( int size )
{
void *pmem = 0 ;
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*/