【MFC】CSingleLock的使用

转载文章: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就是为了使用方便才定义的,你作为成员变量失去他本来的意义了
posted @   RioTian  阅读(185)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
历史上的今天:
2020-07-28 P1379 八数码难题 ( A* 算法 与 IDA_star 算法)
2020-07-28 POJ 1236 Network of Schools (连通图 - Garbow 算法)
点击右上角即可分享
微信分享提示