CAutolock
顾名思义CAutolock就是自动锁的意思,它可以把它之下的代码区锁住一直到其自身被释放掉
后这块代码区中的公共资源才会被其他线程使用。当然这个代码区能尽量少就尽量少,毕竟不能让其他线
程这样一直等下去反而降低了效率。
CAutolock是一个类,要知道它的工作原理就要深度剖析它的内部内容。
首先介绍它的最基础内容:CRITICAL_SECTION.
CRITICAL_SECTION是一个结构体,它在windows.h文件中被定义,它是临界区的意思。就像
多个线程公共访问的资源一样,主要和它涉及相关的四个函数分别是:
InitializeCriticalSection(CRITICAL_SECTION* para) 初始化CRITICAL_SECTION
EnterCriticalSection(CRITICAL_SECTION* para) 进入CRITICAL_SECTION
LeaveCriticalSection(CRITICAL_SECTION* para) 离开CRITICAL_SECTION
DeleteCriticalSection(CRITICAL_SECTION* para) 删除CRITICAL_SECTION
其实单独使用它就可以实现锁,例如:
CRITICAL_SECTION para;
InitializeCriticalSection(¶);
EnterCriticalSection(¶);
………………
LeaveCriticalSection(¶);
DeleteCriticalSection(¶);
这样EnterCriticalSection和LeaveCriticalSection之间的代码区就被锁住了~ 这里面的
公共资源其他线程就访问不到了。
但是这样又会很麻烦,在每个用到公共资源的地方都要成套的把这段代码贴上去很明显影响
了效率,所以就对它进行了封装生成了CAutolock类~ 接下来先看下第一层封装吧!
顾名思义CAutolock就是自动锁的意思,它可以把它之下的代码区锁住一直到其自身被释放掉
后这块代码区中的公共资源才会被其他线程使用。当然这个代码区能尽量少就尽量少,毕竟不能让其他线
程这样一直等下去反而降低了效率。 CAutolock是一个类,要知道它的工作原理就要深度剖析它的内部内容。 首先介绍它的最基础内容:CRITICAL_SECTION.
CRITICAL_SECTION是一个结构体,它在windows.h文件中被定义,它是临界区的意思。就像
多个线程公共访问的资源一样,主要和它涉及相关的四个函数分别是: InitializeCriticalSection(CRITICAL_SECTION* para) 初始化CRITICAL_SECTION
EnterCriticalSection(CRITICAL_SECTION* para) 进入CRITICAL_SECTION
LeaveCriticalSection(CRITICAL_SECTION* para) 离开CRITICAL_SECTION
DeleteCriticalSection(CRITICAL_SECTION* para) 删除CRITICAL_SECTION 其实单独使用它就可以实现锁,例如:
CRITICAL_SECTION para;
InitializeCriticalSection(¶);
EnterCriticalSection(¶);
………………
LeaveCriticalSection(¶);
DeleteCriticalSection(¶);
这样EnterCriticalSection和LeaveCriticalSection之间的代码区就被锁住了~ 这里面的
公共资源其他线程就访问不到了。
但是这样又会很麻烦,在每个用到公共资源的地方都要成套的把这段代码贴上去很明显影响
了效率,所以就对它进行了封装生成了CAutolock类~ 接下来先看下第一层封装吧!
CCritSec类中构造函数对成员变量csec进行初始化,相应的析构函数中对csec进行删除,另外还 封装了lock和unlock函数去执行EnterCriticalSection和LeaveCriticalSection。
对CAutolock的封装就比较简单了:
<span style="font-size:14px;">class CAutolock
{
public:
CCritSec* csec;
CAutolock(CCritSec* critsec)
{
csec = critsec;
csec->lock();
}
~CAutolock()
{
csec->unlock();
}
};</span>
这样下来自动锁的封装就完成了~ 至于使用它,我们只需要定义一个CCritSec变量,然后再用
CAutolock,这样知道CAutolock被析构之前的代码区都会被锁住。
如果我们要锁住的代码区在中间的话我们也可以使用程序块的( {…………} )原理,将临界区包
起来在程序块中定义CAutolock,当代码运行出程序块时CAutolock自动会被析构掉,这样这个程序块内
的代码就会被锁住也不会影响其他代码的执行。
参考文档:http://blog.csdn.net/tutuane/article/details/50404980
CAutolock的更多相关文章
- 在DirectShow中支持DXVA 2.0(Supporting DXVA 2.0 in DirectShow)
这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档.并准备记录一下用ffmpeg实现dxva2,将在第三篇写到.这是第二篇.,英文原址:https://msdn.microso ...
- 转:Media Player Classic - HC 源代码分析
VC2010 编译 Media Player Classic - Home Cinema (mpc-hc) Media Player Classic - Home Cinema (mpc-hc)播放器 ...
- 转:LAV Filter 源代码分析
1: 总体结构 LAV Filter 是一款视频分离和解码软件,他的分离器封装了FFMPEG中的libavformat,解码器则封装了FFMPEG中的libavcodec.它支持十分广泛的视音频格式. ...
- 转:Directshow开发的一些例子
DirectShow Filter 开发典型例子分析 --字幕叠加 (FilterTitleOverlay)1 本文分析一下<DirectShow开发指南>中的一个典型的Transform ...
- DirectShow Filter 开发典型例子分析 ——字幕叠加 (FilterTitleOverlay)1
本文分析一下<DirectShow开发指南>中的一个典型的Transform Filter的例子:字幕叠加(FilterTitleOverlay).通过分析该例子,我们可以学习到Direc ...
- directX--大约CSource和CSourceStream (谁在叫fillbuffer)
CSourceStream类别,它是CSource类别OutputPin[source.h/source.cpp] 派生自CAMThread和CBaseOutputPinl 成员变量: ...
- Filter组件开发中的SDK基类分析
DirectShow SDK提供了一套开发Filter的基类源代码.基于这些基类开发Filter将大大简化开发过程. 1.CBaseObject 大部分SDK类都从CBaseObject类(参见com ...
- DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)
虽然网上已有很多关于DirectShow写source filter的资料,不过很多刚开始学的朋友总说讲的不是很清楚(可能其中作者省略了许多他认为简 单的过程),读者总希望看到象第一步怎么做,第二步怎 ...
- 如何创建Filter的属性页
本篇文档我们将要讲述如何给一个filter创建一个属性页,通过CBasePropertyPage基类.这篇文档的实例代码演 示了创建属性页的步骤,这里我们假设我们要创建属性页的视频filter支持饱和 ...
随机推荐
- Collection was modified; enumeration operation may not execute Dictionary 集合已修改;可能无法执行枚举操作
public void ForeachDic() { Dictionary dic = new Dictionary(); dic.Add("1", 10); dic.Add(&q ...
- MUI框架开发HTML5手机APP(二)--页面跳转传值&底部选项卡切换
概 述 JRedu 在上一篇博客中,我们学习了如何使用Hbuilder创建一个APP,同时如何使用MUI搭建属于自己的第一款APP,没有学习的同学可以戳链接学习: http://www.cnblo ...
- testng + reportng 测试结果邮件发送
https://blog.csdn.net/qq744746842/article/details/51497506 其实大多数的时候我们的测试报告的发送可能都是结合Jenkins发送的,所以这方面更 ...
- python接口自动化测试(六)-unittest-单个用例管理
前面五节主要介绍了环境搭建和requests库的使用,可以使用这些进行接口请求的发送.但是如何管理接口案例?返回结果如何自动校验?这些内容光靠上面五节是不行的,因此从本节开始我们引入python单元测 ...
- Pilosa文档翻译(一)导言、安装
目录 导言 安装 安装在MacOS 使用HomeBrew 下载二进制文件 从源码构建 使用Docker 安装在Linux 下载二进制文件 从源码构建 使用Docker 接下来是什么? 导言 原文地址 ...
- 说说Python编码规范
前言 已有近两个月没有发表过文章了,前段时间外甥和女儿过来这边渡暑假,平常晚上和周末时间都陪着她们了,趁这个周末有空,再抽空再把这块拾起来. 这么久没写了,再次拿起键盘,想想,发表些什 ...
- window下zookeeper的下载启动和报错等问题
在使用dubbo等需要用到zookeeper,之前window下本地部署,启动一直有问题,后面折腾了下才部署成功,此次记录下来. 将zookeeper下载之后,解压到指定目录即可,无需安装.例如:解压 ...
- c# 基于redis分布式锁
在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量. 而同步的本质是通过锁来实现的.为了实现多个线程在 ...
- CentOS 7.x 用shell增加、删除端口
一.在/usr/local/sbin/下创建port文件,不要扩展名,并给权限 chom 777 port #!/bin/bash num=$# ok=0 if [ ${num} == 1 ]; t ...
- [转]用JAVA在读取EXCEL文件时如何判断列隐藏
原文地址:https://www.cnblogs.com/OwenWu/archive/2012/01/03/2310620.html org.apache.poi.hssf.usermodel.HS ...