【MFC】CSingleLock的使用

发布时间 2023-07-28 12:43:42作者: Koshkaaa

转载文章:CSingleLock的使用

// 先看看其代码:
// 声明
class CSingleLock
{
  // Constructors
  public:
  CSingleLock(CSyncObject* pObject, BOOL bInitialLock = FALSE);

  // Operations
  public:
  BOOL Lock(DWORD dwTimeOut = INFINITE);
  BOOL Unlock();
  BOOL Unlock(LONG lCount, LPLONG lPrevCount = NULL);
  BOOL IsLocked();

  // Implementation
  public:
  ~CSingleLock();

  protected:
  CSyncObject* m_pObject;
  HANDLE m_hObject;
  BOOL    m_bAcquired;
};

// 实现
CSingleLock::CSingleLock(CSyncObject* pObject, BOOL bInitialLock)
{
  ASSERT(pObject != NULL);
  ASSERT(pObject->IsKindOf(RUNTIME_CLASS(CSyncObject)));

  m_pObject = pObject;
  m_hObject = pObject->m_hObject;
  m_bAcquired = FALSE;

  if (bInitialLock)
   Lock();
}

BOOL CSingleLock::Lock(DWORD dwTimeOut /* = INFINITE */)
{
  ASSERT(m_pObject != NULL || m_hObject != NULL);
  ASSERT(!m_bAcquired);

  m_bAcquired = m_pObject->Lock(dwTimeOut);
  return m_bAcquired;
}

BOOL CSingleLock::Unlock()
{
  ASSERT(m_pObject != NULL);
  if (m_bAcquired)
   m_bAcquired = !m_pObject->Unlock();

  // successfully unlocking means it isn't acquired
  return !m_bAcquired;
}

BOOL CSingleLock::Unlock(LONG lCount, LPLONG lpPrevCount /* = NULL */)
{
  ASSERT(m_pObject != NULL);
  if (m_bAcquired)
   m_bAcquired = !m_pObject->Unlock(lCount, lpPrevCount);

  // successfully unlocking means it isn't acquired
  return !m_bAcquired;
}

BOOL CSingleLock::IsLocked()
{ 
  return m_bAcquired; 
}

CSingleLock::~CSingleLock()
{
  Unlock(); 
}

综上得CSingleLock之使用:

  • CSingleLock在函数内使用,当函数返回时将释放CSingleLock对象,同时进行解锁
  • CSingleLock对象在栈上定义,构造时,Lock;CSingleLock的析构函数会自动调用同步对象的Unlock。
  • CSingleLock就是为了使用方便才定义的,你作为成员变量失去他本来的意义了