16,472
社区成员
发帖
与我相关
我的任务
分享
#pragma once
#include <list>
class CMyLock
{
public:
CMyLock();
virtual ~CMyLock();
enum LOCK_MODE
{
LOCK_MODE_NONE,
LOCK_MODE_ONLY_ONE, //独占模式
LOCK_MODE_MORE_USER, //分享模式
};
private:
struct LOCK_ITME
{
DWORD nThreadID;
LOCK_MODE nLockMode;
} ;
typedef std::list<LOCK_ITME> CListItem;
typedef std::list<LOCK_ITME>::iterator CPListItem;
private:
LOCK_MODE m_curMode;
CCriticalSection m_cs;
CListItem m_listItem;
CCriticalSection m_csList;
public:
BOOL Lock(LOCK_MODE const &nMode = LOCK_MODE_MORE_USER);
BOOL Unlock();
};
#include "MyLock.h"
CMyLock::CMyLock()
:m_curMode(LOCK_MODE_NONE)
{
}
CMyLock::~CMyLock()
{
}
BOOL CMyLock::Lock(LOCK_MODE const &lockMode)
{
//注意 锁和当前线程关联,解锁时只能是当前线程。
LOCK_ITME item = {0};
item.nThreadID = GetCurrentThreadId();
item.nLockMode = lockMode;
BOOL bWait = TRUE;
switch (lockMode)
{
case LOCK_MODE_ONLY_ONE:
bWait = TRUE;
break;
case LOCK_MODE_MORE_USER:
if (LOCK_MODE_MORE_USER == m_curMode)
{
bWait = FALSE;
}
else
{
bWait = TRUE;
}
break;
default:
ASSERT(0);
return FALSE;
break;
}
if (bWait)
{
m_cs.Lock();
}
m_csList.Lock();
m_curMode = lockMode;
m_listItem.push_back(item);
m_csList.Unlock();
return TRUE;
}
BOOL CMyLock::Unlock()
{
//只能释放当前线程的锁
DWORD const nThreadID = GetCurrentThreadId();
BOOL bFind = FALSE;
m_csList.Lock();
CPListItem it = m_listItem.begin();
for (;it != m_listItem.end(); ++it)
{
if (nThreadID == it->nThreadID)
{
m_listItem.erase(it);
bFind = TRUE;
break;
}
}
if (m_listItem.empty())
{
m_curMode = LOCK_MODE_NONE;
m_cs.Unlock();
}
m_csList.Unlock();
ASSERT(bFind);
return bFind;
}
// Request ownership of the critical section.
EnterCriticalSection(&CriticalSection);
// Access the shared resource.
// Release ownership of the critical section.
LeaveCriticalSection(&CriticalSection);