Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1739143
  • 博文数量: 263
  • 博客积分: 1218
  • 博客等级: 少尉
  • 技术积分: 2862
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-19 02:33
文章分类

全部博文(263)

文章存档

2020年(12)

2019年(2)

2018年(10)

2016年(1)

2015年(20)

2014年(115)

2013年(46)

2012年(37)

2011年(20)

分类: C/C++

2014-10-27 14:25:54

如果想要某些事情成对出现,使用构造函数和析构函数。

 

为保证线程同步/互斥,经常使用信号量、互斥量、临界区和事件。以临界区 CRITICAL_SECTION 为例,需要

InitializeCriticalSection 和 DeleteCriticalSection

EnterCriticalSection 和 LeaveCriticalSection

成对配合使用,否则可能出现资源泄漏甚至死锁的情况。

考虑以下程序片段,中间的代码可能出现异常,导致控制转移。或者函数有多个出口,就需要在每个出口前调用LeaveCriticalSection。


点击(此处)折叠或打开

  1. CRITICAL_SECTION _cs;
  2. void SomeFunc()
  3. {
  4.     EnterCriticalSection(&_cs);
  5.   
  6.     //可能抛出异常
  7.   
  8.     LeaveCriticalSection(&_cs);
  9. }
我们希望EnterCriticalSection(或者其他lock 函数)和 LeaveCriticalSection(或者其他unlock 函数)成对出现,最好的方法是用class来包装,且分别在构造函数和析构函数中实现。

点击(此处)折叠或打开

  1. #include <Windows.h>
  2.   
  3. class Lock
  4. {
  5. public:
  6.     Lock();
  7.     ~Lock();
  8.     void Enter(int id = 0);
  9.     void Leave();
  10. private:
  11.     CRITICAL_SECTION _cs;
  12.     DWORD dwOwningThread;
  13.     int iEnterCount;
  14.     int iId;
  15. };
  16.   
  17. class AutoLock
  18. {
  19. public:
  20.     AutoLock(Lock* target, int id = 0);
  21.     ~AutoLock();
  22. private:
  23.     Lock* _target;
  24. };

点击(此处)折叠或打开

  1. #include <Windows.h>
  2.   
  3. class Lock
  4. {
  5. public:
  6.     Lock();
  7.     ~Lock();
  8.     void Enter(int id = 0);
  9.     void Leave();
  10. private:
  11.     CRITICAL_SECTION _cs;
  12.     DWORD dwOwningThread;
  13.     int iEnterCount;
  14.     int iId;
  15. };
  16.   
  17. class AutoLock
  18. {
  19. public:
  20.     AutoLock(Lock* target, int id = 0);
  21.     ~AutoLock();
  22. private:
  23.     Lock* _target;
  24. };
直接使用 AutoLock 类,而不用考虑释放临界区的问题。

点击(此处)折叠或打开

  1. Lock* workBufferLock;
  2. //...
  3. AutoLock lock(workBufferLock);
  4. //...
这个方法应用在很多场合,比如网络访问中建立连接和断开连接,数据库访问中的登录和登出,测量函数平均运行耗时等。

【参考】

Solmyr 的小品文系列之六:成对出现
 
Solmyr 的小品文系列之六:成对出现

转: http://blog.csdn.net/lilypp/article/details/6617830


阅读(1440) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~