新浪围脖开放平台一"各种锁"

#ifndef __lo_LOCK_H__
#define __lo_LOCK_H__

#ifdef WIN32

#include <common/lo/lodefine.h>
#include <Windows.h>

DEFINE_NAMESPACE(locom)

class CloSemaphore
{
private:
 CloSemaphore& operator=(const CloSemaphore& r);
public:
 CloSemaphore(HANDLE* psem)
  :m_psem(psem)
 {
  *m_psem = ::CreateSemaphore(0,1,0XFFFF,0);
 }
 ~CloSemaphore()
 {
  ReleaseSemaphore(*m_psem,1,0);
  CloseHandle(*m_psem);
 }
 void Lock()
 {
  ::WaitForSingleObject(*m_psem,INFINITE);
 }
 void UnLock()
 {
  ReleaseSemaphore(*m_psem,1,0);
 }
private:
 HANDLE*   m_psem;
};

class CloCriticalSection
{
private:
 CRITICAL_SECTION *m_pSec;
public:
 CloCriticalSection( CRITICAL_SECTION *pSec )
  :m_pSec(pSec)
 {
  if ( m_pSec )
  {
   ::InitializeCriticalSection(m_pSec);
  }

 }

 ~CloCriticalSection()
 {
  if ( m_pSec )
  {
   ::DeleteCriticalSection(m_pSec);
  }
 }

 void Lock()
 {
  if ( m_pSec )
  {
   ::EnterCriticalSection(m_pSec);
  }

 }

 void UnLock()
 {
  if ( m_pSec )
  {
   ::LeaveCriticalSection(m_pSec);
  }
 }
};

class CloEvent
{
protected:
 HANDLE *m_pHandle;

public:
 CloEvent(HANDLE *pHandle,BOOL bManual)
  :m_pHandle(pHandle)
 {
  *m_pHandle = CreateEvent(NULL,bManual,FALSE,NULL);
 }

 ~CloEvent()
 {
  CloseHandle(*m_pHandle);
 }
};

class CloManualEvent : public CloEvent
{

private:
 HANDLE *m_pHandle;

public:
 CloManualEvent(HANDLE *pHandle)
  :CloEvent(pHandle,TRUE)
 {
 }

 void Lock()
 {
  WaitForSingleObject(*m_pHandle,INFINITE);
  ResetEvent(*m_pHandle);
 }

 void UnLock()
 {
  //使其有信号
  SetEvent(*m_pHandle);
 }
};

class CloAutoEvent : public CloEvent
{
public:
 CloAutoEvent(HANDLE *pHandle)
  :CloEvent(pHandle,FALSE)
 {

 }
 void Lock()
 {
  WaitForSingleObject(*m_pHandle,INFINITE);   
 }
 void UnLock()
 {
  //使其有信号
  SetEvent(*m_pHandle);
 }
};

class CloSignalEvent : public CloEvent
{
private:
 HANDLE pHandle;
public:

 CloSignalEvent()
  :CloEvent(&pHandle,FALSE)
 {

 }
 void Wait(int cms)
 {
  WaitForSingleObject(pHandle,cms);   
 }

 void WakeUp()
 {
  //使其有信号
  SetEvent(pHandle);
 }

 HANDLE Handle(void) const{ return pHandle;}
};

class CloMetuex
{
private:
 HANDLE *m_pHandle;

public:
 CloMetuex(HANDLE *pHandle)
  :m_pHandle(pHandle)
 {
  *m_pHandle = CreateMutex(NULL,FALSE,NULL);
 }

 ~CloMetuex()
 {
  CloseHandle(*m_pHandle);
 }

 void Lock()
 {
  WaitForSingleObject(*m_pHandle,INFINITE);
 }

 void UnLock()
 {
  ReleaseMutex(*m_pHandle);
 }
};

template<typename Type, typename LockPolicy>
class CloSmartLock
{
private:
 Type  m_Type;
 LockPolicy m_Policy;

public:
 CloSmartLock():m_Policy(&m_Type)
 {
 }

 void Lock()
 {
  m_Policy.Lock();
 }

 void UnLock()
 {
  m_Policy.UnLock();
 }
};

template<typename Type, typename LockPolicy>
class CloAutoLock
{
private:
 CloSmartLock<Type,LockPolicy> *m_pLock;
public:
 CloAutoLock(CloSmartLock<Type,LockPolicy> *pLock)
  :m_pLock(pLock)
 {
  m_pLock->Lock();
 }

 ~CloAutoLock()
 {
  m_pLock->UnLock();
 }
};

END_NAMESPACE(locom)

#endif // WIN32

#endif //__lo_LOCK_H__

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值