顾名思义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类~ 接下来先看下第一层封装吧!
1 顾名思义CAutolock就是自动锁的意思,它可以把它之下的代码区锁住一直到其自身被释放掉 2 后这块代码区中的公共资源才会被其他线程使用。当然这个代码区能尽量少就尽量少,毕竟不能让其他线 3 程这样一直等下去反而降低了效率。 4 5 CAutolock是一个类,要知道它的工作原理就要深度剖析它的内部内容。 6 7 首先介绍它的最基础内容:CRITICAL_SECTION. 8 CRITICAL_SECTION是一个结构体,它在windows.h文件中被定义,它是临界区的意思。就像 9 多个线程公共访问的资源一样,主要和它涉及相关的四个函数分别是: 10 11 InitializeCriticalSection(CRITICAL_SECTION* para) 初始化CRITICAL_SECTION 12 EnterCriticalSection(CRITICAL_SECTION* para) 进入CRITICAL_SECTION 13 LeaveCriticalSection(CRITICAL_SECTION* para) 离开CRITICAL_SECTION 14 DeleteCriticalSection(CRITICAL_SECTION* para) 删除CRITICAL_SECTION 15 16 其实单独使用它就可以实现锁,例如: 17 CRITICAL_SECTION para; 18 InitializeCriticalSection(¶); 19 EnterCriticalSection(¶); 20 ……………… 21 LeaveCriticalSection(¶); 22 DeleteCriticalSection(¶); 23 这样EnterCriticalSection和LeaveCriticalSection之间的代码区就被锁住了~ 这里面的 24 公共资源其他线程就访问不到了。 25 但是这样又会很麻烦,在每个用到公共资源的地方都要成套的把这段代码贴上去很明显影响 26 了效率,所以就对它进行了封装生成了CAutolock类~ 接下来先看下第一层封装吧!
CCritSec类中构造函数对成员变量csec进行初始化,相应的析构函数中对csec进行删除,另外还 封装了lock和unlock函数去执行EnterCriticalSection和LeaveCriticalSection。
对CAutolock的封装就比较简单了:
1 <span style="font-size:14px;">class CAutolock 2 { 3 public: 4 CCritSec* csec; 5 CAutolock(CCritSec* critsec) 6 { 7 csec = critsec; 8 csec->lock(); 9 } 10 ~CAutolock() 11 { 12 csec->unlock(); 13 } 14 };</span>
这样下来自动锁的封装就完成了~ 至于使用它,我们只需要定义一个CCritSec变量,然后再用
CAutolock,这样知道CAutolock被析构之前的代码区都会被锁住。
如果我们要锁住的代码区在中间的话我们也可以使用程序块的( {…………} )原理,将临界区包
起来在程序块中定义CAutolock,当代码运行出程序块时CAutolock自动会被析构掉,这样这个程序块内
的代码就会被锁住也不会影响其他代码的执行。
参考文档:http://blog.csdn.net/tutuane/article/details/50404980