新浪围脖开放平台一"各种锁"
2010-12-10 22:01
281 查看
#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__
#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__
相关文章推荐
- 新浪围脖开放平台二"各种编码转换"
- 新浪围脖开放平台三"urlEncode"
- 新浪围脖开放平台四"xml解析"
- 新浪围脖开放平台五"string的替代品"
- 新浪围脖开放平台六"字符串转化"
- 新浪微博开放平台站内应用开发流程直播(二)
- DevStore开发人员服务有奖征文:小谈新浪微博开放平台
- 腾讯与新浪微博开放平台之比较
- 各种开放平台
- 获取新浪开放平台的Access token
- air 新浪开放平台 登录部分接口案例
- OAuth2.0学习(1-2)OAuth2.0的一个企业级应用场景 - 新浪开放平台微博OAuth2.0认证
- 新浪开放平台---用code获取access_token(oauth2)
- QQ、微信、新浪等开放平台网址(申请接入)
- 新浪微博开放平台开发-android客户端(2)
- 新浪开放平台---oauth2认证流程 casperjs自动登录和授权 api需要注意的问题及bug
- 新浪微博开放平台开发总结
- 新浪微博开放平台开发-android客户端(2)
- 新浪开放平台入门及基本步骤(java SDK)
- 新浪微博开放平台开发-android客户端(2)