首页 > 其他分享 >【MFC】CSingleLock的使用

【MFC】CSingleLock的使用

时间:2023-07-28 12:44:07浏览次数:36  
标签:MFC Unlock bAcquired BOOL CSingleLock 使用 pObject NULL

转载文章: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就是为了使用方便才定义的,你作为成员变量失去他本来的意义了

标签:MFC,Unlock,bAcquired,BOOL,CSingleLock,使用,pObject,NULL
From: https://www.cnblogs.com/RioTian/p/17587296.html

相关文章

  • Three.js使用InstancedMesh实现性能优化
    1.引言有这么一种场景:需要渲染一座桥,桥有很多桥柱,桥柱除了位置与倾斜角度不完全相同外,其他均相同,由于桥柱数量很大,使用three.js绘制较为卡顿,如何优化?注意,要求后续能选中某个桥柱2.概念2.1合并几何体three.js官方教程里提到,大量对象的优化-three.jsmanual(threejs.org),......
  • LibGdx 游戏引擎 freetype 使用指南
    网上大多数的Libgdx文档,使用的版本都是0.9X的时候留下的,1.X版本的比较少。freetype在1.X时使用发生发生了变化,写一下变化。本人使用的是Libgdx1.6版本。首先给两个传送门,可以去Git上看官方的wiki。官方的freetype说明https://github.com/libgdx/libgdx/wiki/Gdx-freetype官方的......
  • 使用 docker 部署 mycat 中间件配置数据库读写分离、分库分表
    文章目录前言配置镜像配置文件server.xml服务配置文件,包含登录用户配置schema.xml逻辑表配置rule.xml分片规则将这三个配置文件放置到固定的位置,方便后面使用启动dockercomposedockercompose启动测试前言之前有一篇博客已经在docker中将mysql的主从配置讲述了,没有看的童......
  • AndroidAnnotations 使用在library项目中出现无法找到R文件下资源索引的错误
    AndroidAnnotations使用在library项目中出现无法找到R文件下资源索引的错误使用AndroidAnnotations(以下简称AA)已经有一段时间了,挺好用的,基本上完全可以满足Android开发需要,可以简化代码,所以现在在岗编写的所有的项目都是基于AA实现的。AA现在最新版本为3.2官方地址:http://android......
  • Windows PowerShell 使用SDKMAN
    前言sdkman(TheSoftwareDevelopmentKitManager),从名字上就可以很明显的感觉到,这个软件是干什么的,有点像Nodejs中的nvm工具。在开发过程中,总能遇到这样一种情况,就是有些时候要这个版本的,有些时候要使用其他版本的,这样就得不停的切换环境变量中的设置。使用sdkman即可......
  • ubuntu 使用vsftpd 创建FTP服务(用户名密码登录,限制列出目录)
    vsftpd介绍ubuntu安装vsftpd配置vsftpd备份vsftpdconfig编辑vsftpdconfig创建登录用户添加vsftpd登录用户添加vsftpd登录用户对目录树的权限重启vsftpd服务验证ftp服务vsftpd介绍vsftpd是“verysecureFTPdaemon”的缩写,安全性是它的一个最大的特点。vsftpd是一个UNIX......
  • Spring boot gradle docker plugin 使用
    Springbootgradledockerplugin使用Springbootgradledockerplugin使用前言增加GradleDocker插件使用GradleDocker插件DockerFile运行docker指令生成DockerImage使用IDEA运行docker指令前言当前容器技术、微服务、JVM语言等新的技术正在快速的占领着Java开发市场,J......
  • Unity UGUI的Physics2DRaycaster (2D物理射线检测)组件的介绍及使用
    UnityUGUI的Physics2DRaycaster(2D物理射线检测)组件的介绍及使用一、什么是Physics2DRaycaster组件?Physics2DRaycaster是Unity中的一个UGUI组件,用于在2D场景中进行物理射线检测。它可以检测鼠标或触摸事件在UI元素上的碰撞,并将事件传递给相应的UI元素。二、Physics2DRaycaste......
  • Unity UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用
    UnityUGUI的PhysicsRaycaster(物理射线检测)组件的介绍及使用1.什么是PhysicsRaycaster组件?PhysicsRaycaster是UnityUGUI中的一个组件,用于在UI元素上进行物理射线检测。它可以检测鼠标或触摸事件是否发生在UI元素上,并将事件传递给相应的UI元素。2.PhysicsRaycaster的工作......
  • YAML+PyYAML笔记 2 | YAML缩进、分离、注释简单使用
    (2|YAML缩进、分离、注释简单使用)1简介YAML不是一种标记语言,而是一种数据格式;使用缩进和分离来表示数据结构,不需要使用额外的标记语言。2缩进使用缩进来表示嵌套关系;标识方式为使用空格;缩进必须使用相同数量的空格;比如以下每个列表项都由一个连字符开头,后面跟着一......