用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();        }    }};

        分析这段代码,在构造函数中完成锁的请求,后面的类方法实现中,不管是怎么操作,当类的生命周期结束以后,都会自动调用类的析构函数,在这个析构函数中就自动完成了锁的释放工作,这样不管是因为人工的记性问题还是源码的逻辑问题导致的锁没有释放的后果,都可以得到完美的解决。

原创粉丝点击