用C++实现锁的自动释放
来源:互联网 发布:灰度图像轮廓提取算法 编辑:程序博客网 时间:2024/05/20 11:46
我在做多核核多任务程序时,常遇到这样一个问题:为了互斥访问我会习惯性的手动加锁,但却老是养不成手动解锁的习惯,其实很多时候也不是自己养不成,主要是多核下任务量一多,复杂性就跟着起来,是不是的就给忘了,我能咋办呢?想来想去,也参考了一些资料,想到C++中不是有析构函数么?析构函数是可以自动被调用的,把锁的释放工作放到析构函数中去,这样不是可以自动完成锁的自动释放工作了,这是多么的完美!当然还有很多情况,是由于逻辑的关系使得多核/多任务下锁的释放也不那么容易,比如:
EnterCriticalsSection();if(shared_var==0){ DoSomeWork();}else{ return;}LeaveCriticalSection();
在这里遇到的就不是单纯忘记的问题了。分析:在else分支的return语句执行后,没有执行解锁操作,导致其他等待同一个锁的线程获取不到锁,这就导致了死锁。这个问题怎么解决了,回到开始说的方法:我们知道C++中的析构函数具有被自动调用的特性,所以我们就可以把锁的释放工作放到析构函数中,让其自动调用析构函数时自动完成解锁的工作。比如下面的示例:
template<classT>classCScopedLock{private: T *m_pLock;public: CScopedLock(T &L){ m_pLock=&L; m_pLock->Acquire(); } ~CScopedLock(){ if(m_pLock!=NULL){ m_pLock->Release(); } }};
分析这段代码,在构造函数中完成锁的请求,后面的类方法实现中,不管是怎么操作,当类的生命周期结束以后,都会自动调用类的析构函数,在这个析构函数中就自动完成了锁的释放工作,这样不管是因为人工的记性问题还是源码的逻辑问题导致的锁没有释放的后果,都可以得到完美的解决。
- 用C++实现锁的自动释放
- 实现C语言自动释放资源的方法与探讨
- 关于锁的自动释放
- Objective c 自动释放池
- 动态分配资源的自动释放 - auto_ptr的实现原理
- 动态分配资源的自动释放 – auto_ptr的实现原理
- 动态分配资源的自动释放 – auto_ptr的实现原理
- 动态分配资源的自动释放 – auto_ptr的实现原理
- 动态分配资源的自动释放 – auto_ptr的实现原理
- 动态分配资源的自动释放 – auto_ptr的实现原理 .
- 动态分配资源的自动释放 – auto_ptr的实现原理
- 动态分配资源的自动释放 – auto_ptr的实现原理
- 动态分配资源的自动释放 – auto_ptr的实现原理
- (五十八)NSObject实现多线程、自动释放池的补充
- IOS内存管理--自动释放池的实现原理
- 通过RAII机制实现资源的自动释放
- 函数资源的自动释放
- 自动释放池的使用
- mingw环境下boost库的编译和使用
- 社交网络数据挖掘公司乐荐推出“我好想网”:动真格的社交
- Oracle不完全恢复
- 容易被黑客攻击的10个漏洞
- ie下调整图片长宽的问题
- 用C++实现锁的自动释放
- vim中缩进的设置以及将tab转换成空格 .
- Linux命令系列之(一)---控制符
- Java IO: Pipes
- 简单函数解决ListView和ScrollView冲突问题
- c/c++/vc非技术问题
- 'O_BINARY' undeclared (first use in this function)
- java io InputStream Reader
- DOM study notes