顾名思义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(&para);

             EnterCriticalSection(&para);

             ………………

             LeaveCriticalSection(&para);

             DeleteCriticalSection(&para);

             这样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(&para);
EnterCriticalSection(&para);
………………
LeaveCriticalSection(&para);
DeleteCriticalSection(&para);
这样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的更多相关文章

  1. 在DirectShow中支持DXVA 2.0(Supporting DXVA 2.0 in DirectShow)

    这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档.并准备记录一下用ffmpeg实现dxva2,将在第三篇写到.这是第二篇.,英文原址:https://msdn.microso ...

  2. 转:Media Player Classic - HC 源代码分析

    VC2010 编译 Media Player Classic - Home Cinema (mpc-hc) Media Player Classic - Home Cinema (mpc-hc)播放器 ...

  3. 转:LAV Filter 源代码分析

    1: 总体结构 LAV Filter 是一款视频分离和解码软件,他的分离器封装了FFMPEG中的libavformat,解码器则封装了FFMPEG中的libavcodec.它支持十分广泛的视音频格式. ...

  4. 转:Directshow开发的一些例子

    DirectShow Filter 开发典型例子分析 --字幕叠加 (FilterTitleOverlay)1 本文分析一下<DirectShow开发指南>中的一个典型的Transform ...

  5. DirectShow Filter 开发典型例子分析 ——字幕叠加 (FilterTitleOverlay)1

    本文分析一下<DirectShow开发指南>中的一个典型的Transform Filter的例子:字幕叠加(FilterTitleOverlay).通过分析该例子,我们可以学习到Direc ...

  6. directX--大约CSource和CSourceStream (谁在叫fillbuffer)

    CSourceStream类别,它是CSource类别OutputPin[source.h/source.cpp] 派生自CAMThread和CBaseOutputPinl         成员变量: ...

  7. Filter组件开发中的SDK基类分析

    DirectShow SDK提供了一套开发Filter的基类源代码.基于这些基类开发Filter将大大简化开发过程. 1.CBaseObject 大部分SDK类都从CBaseObject类(参见com ...

  8. DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)

    虽然网上已有很多关于DirectShow写source filter的资料,不过很多刚开始学的朋友总说讲的不是很清楚(可能其中作者省略了许多他认为简 单的过程),读者总希望看到象第一步怎么做,第二步怎 ...

  9. 如何创建Filter的属性页

    本篇文档我们将要讲述如何给一个filter创建一个属性页,通过CBasePropertyPage基类.这篇文档的实例代码演 示了创建属性页的步骤,这里我们假设我们要创建属性页的视频filter支持饱和 ...

随机推荐

  1. 如何将Powerdesign物理模型中的name复制成comment

    Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' the current model ' get t ...

  2. SSE图像算法优化系列二十三: 基于value-and-criterion structure 系列滤波器(如Kuwahara,MLV,MCV滤波器)的优化。

    基于value-and-criterion structure方式的实现的滤波器在原理上其实比较简单,感觉下面论文中得一段话已经描述的比较清晰了,直接贴英文吧,感觉翻译过来反而失去了原始的韵味了. T ...

  3. ionic cordova plugin 安装和使用

    注意事项 ionic1需要ng-cordova plugin的使用都需要放到deviceready事件的回调中, 设备准备好了才能设备交互 plugin只有在真机上才有效果, 模拟器(部分)和brow ...

  4. protobuf 动态创建

    https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html https://originlee.com/2015/03/14/ana ...

  5. 手把手教你用Strace诊断问题[转]

    早些年,如果你知道有个 strace 命令,就很牛了,而现在大家基本都知道 strace 了,如果你遇到性能问题求助别人,十有八九会建议你用 strace 挂上去看看,不过当你挂上去了,看着满屏翻滚的 ...

  6. mysqldump详解之--master-data

    在前一篇文章中,有提到mysqldump的--single-transaction参数.另外还有个很重要,也是运维中经常用到的参数:--master-data,网上很多关于MySQL不停机备份的实现都 ...

  7. SpringBoot中自定义properties文件配置参数并带有输入提示

    1. 创建配置类 在项目中创建一个参数映射类如下 @ConfigurationProperties(prefix = "user.info") public class MyPro ...

  8. Mssql Server2005中更改sa的用户名的多种方法

    mssql安装上去时默认就是sa用户,大多数用户都会一直使用sa这个用户,这样数据库就存在很大的安全问题了,如果我们能把sa用户名修改,这样安全级别又高了一层哦,下面我们来看修改sa用户名的办法.   ...

  9. [sh]top添加到crontab不生效问题解决

    今天遇到个小问题 top结果赋值给变量,放到文件做处理, 但是不生效问题. https://www.phpbulo.com/archives/509.html cat top.sh NAME=&quo ...

  10. Object type TYPE failed to create with error

    ORA-39083: Object type TYPE failed to create with error: ORA-02304: invalid object identifier litera ...