《c/c++商用工程之道》代码实现之2_锁_多线程安全的变量

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值