6.2 锁对象 p225
#ifdef WIN32
#include <windows.h>
#define MUTEX CRITICAL_SECTION
#define MUTEXINIT(m) InitializeCriticalSection(m)
#define MUTEXLOCK(m) EnterCriticalSection(m)
#define MUTEXUNLOCK(m) LeaveCriticalSection(m)
#define MUTEXDESTROY(m) DeleteCriticalSection(m)
#else
#define MUTEX pthread_mutex_t
#define MUTEXINIT(m) pthread_mutex_init(m,NULL)
#define MUTEXLOCK(m) pthread_mutex_Lock(m)
#define MUTEXUNLOCK(m) pthread_mutex_unLock(m)
#define MUTEXDESTROY(m) pthread_mutex_destroy(m)
#endif
class CMutexLock
{
public:
CMutexLock(void)
{
MUTEXINIT(&m_Lock);
}
~CMutexLock(void)
{
MUTEXDESTROY(&m_Lock);
}
public:
void Lock(){MUTEXLOCK(&m_Lock);}
void UnLock(){MUTEXUNLOCK(&m_Lock);}
private:
MUTEX m_Lock;
};
6.3 多线程安全的变量
typedef struct _MINT_
{
int m_nValue;
MUTEX m_Lock;
}MINT;
typedef struct _MBOOL_
{
bool m_nValue;
MUTEX m_Lock;
}MBOOL;
inline int MvarInit(MINT& (mValue),int nValue=0)
{
MUTEXINIT(&mValue.m_Lock);
mValue.m_nValue = nValue;
return nValue;
}
inline void MvarDestroy(MINT& (mValue))
{
MUTEXLOCK(&mValue.m_Lock);
MUTEXUNLOCK(&mValue.m_Lock);
MUTEXDESTROY(&mValue.m_Lock);
}
inline int MvarSet(MINT& (mValue),int nValue)
{
MUTEXLOCK(&mValue.m_Lock);
mValue.m_nValue = nValue;
MUTEXUNLOCK(&mValue.m_Lock);
return nValue;
}
inline int MvarGet(MINT& (mValue))
{
int nValue;
MUTEXLOCK(&mValue.m_Lock);
nValue = mValue.m_nValue;
MUTEXUNLOCK(&mValue.m_Lock);
return nValue;
}
inline int MvarADD(MINT& (mValue),int nValue=1)
{
int nRet=0;
MUTEXLOCK(&mValue.m_Lock);
mValue.m_nValue += nValue;
nRet= mValue.m_nValue;
MUTEXUNLOCK(&mValue.m_Lock);
return nRet;
}
inline int MvarDEC(MINT& (mValue),int nValue=1)
{
int nRet=0;
MUTEXLOCK(&mValue.m_Lock);
mValue.m_nValue -= nValue;
nRet= mValue.m_nValue;
MUTEXUNLOCK(&mValue.m_Lock);
return nRet;
}
为了与MINT区分,本人增加了一个MBOOL类型,也相应增加了这些操作函数:
inline bool lockbool_init(MBOOL& (mValue),bool nValue=0)
{
MUTEXINIT(&mValue.m_Lock);
mValue.m_nValue = nValue;
return nValue;
}
inline void lockbool_destory(MBOOL& (mValue))
{
MUTEXLOCK(&mValue.m_Lock);
MUTEXUNLOCK(&mValue.m_Lock);
MUTEXDESTROY(&mValue.m_Lock);
}
inline bool lockbool_set(MBOOL& (mValue),bool nValue)
{
MUTEXLOCK(&mValue.m_Lock);
mValue.m_nValue = nValue;
MUTEXUNLOCK(&mValue.m_Lock);
return nValue;
}
inline bool lockbool_get(MBOOL& (mValue))
{
bool nValue;
MUTEXLOCK(&mValue.m_Lock);
nValue = mValue.m_nValue;
MUTEXUNLOCK(&mValue.m_Lock);
return nValue;
}
c++类实现 p229
class CMint
{
public:
CMint(int nValue=0)
{
MvarInit(m_nValue,nValue);
}
~CMint( )
{
MvarDestroy(m_nValue);
}
public:
int Get()
{
return MvarGet(m_nValue);
}
int Set(int nValue)
{
return MvarSet(m_nValue,nValue);
}
int ADD(int nValue=1)
{
return MvarADD(m_nValue,nValue);
}
int DEC(int nValue=1)
{
return MvarDEC(m_nValue,nValue);
}
private:
MINT m_nValue;
};
class CMbool
{
public:
CMbool(bool nValue=false)
{
lockbool_init(m_nValue,nValue);
}
~CMbool( )
{
lockbool_destory(m_nValue);
}
public:
bool Get()
{
return lockbool_get(m_nValue);
}
bool Set(bool nValue)
{
return lockbool_set(m_nValue,nValue);
}
private:
MBOOL m_nValue;
};
来源:http://blog.csdn.net/lezhiyong