Files
mir_server/sdk/system/Lock.h

117 lines
2.2 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _MLOCK_H_
#define _MLOCK_H_
/******************************************************************
*
* wyLib库数互斥锁类
*
* *
* Windows中提供临界区锁(CCSLock)(
* CAtomLock)
* 使CSafeLock类
*
*****************************************************************/
namespace wylib
{
namespace sync
{
namespace lock
{
/* 基础锁类
*/
class CBaseLock
{
public:
virtual void _Lock( char * sFile, int nLine) = 0;
virtual BOOL TryLock() = 0;
virtual void _Unlock( char * sFile, int nLine) = 0;
//为了定位死锁问题,增加了锁定者的位置
#define Lock() _Lock( (char *)__FILE__, __LINE__)
#define Unlock() _Unlock( (char *)__FILE__, __LINE__)
protected:
char * m_pFileName; //锁定者的文件名
int m_nLine; //锁定者的行数
};
class CCSLock
: public CBaseLock
{
public:
typedef CBaseLock Inherited;
private:
#ifdef WIN32
CRITICAL_SECTION m_CriticalSection;
#else
//static bool attr_initalized;
//static pthread_mutexattr_t attr;
pthread_mutex_t mutex;
#endif
public:
CCSLock();
virtual ~CCSLock();
void _Lock( char * sFile, int nLine);
void _Unlock( char * sFile, int nLine);
BOOL TryLock();
};
//#ifdef WIN32
class CAtomLock
: public CBaseLock
{
public:
typedef CBaseLock Inherited;
enum AtomLockState
{
Unlocked = 0,
Locked = 1,
};
private:
LONG volatile m_uLockFlag;
DWORD volatile m_dwLockThread;
DWORD volatile m_dwLockCount;
public:
CAtomLock();
virtual ~CAtomLock();
void _Lock( char * sFile, int nLine);
BOOL TryLock();
void _Unlock( char * sFile, int nLine);
virtual void OnLockWait();
};
//#else
// #define CAtomLock CCSLock
//#endif
class CSafeLock
{
private:
CBaseLock *m_pLock;
public:
inline CSafeLock(CBaseLock *pLock)
{
m_pLock = pLock;
pLock->Lock();
}
inline ~CSafeLock()
{
m_pLock->Unlock();
}
};
};
};
};
#endif