zoukankan      html  css  js  c++  java
  • 自动锁

    新学了一个技巧:自动锁,类似于ace的自动锁,进入作用域声明一个用mutex初始化的自动锁对象,对象声明成功则表示获取锁资源成功,程序继续运行,否则持续等待;在离开作用域时自动释放锁。

    class AutoLock
    {
    public:
        AutoLock(pthread_mutex_t* pMutex):m_mutex(pMutex)
        {
            pthread_mutex_lock(m_mutex);
        }
        ~AutoLock()
        {
            pthread_mutex_unlock(m_mutex);
        }
    private:
        pthread_mutex_t *m_mutex;
    };

    调用则如下 


    //预处理,初始化锁资源
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);

    pthread_mutex_t tid;        
    pthread_mutex_init(&tid, &attr);

    function()
    {
        //进入作用域自动锁定资源,且离开作用域自动释放资源,不需要每一个出口手动释放资源,提高健壮性
        DCPParamAutoLock   lock(&tid);
        //do something and leave effect zone
    }

         嗯,简单好用。

         补充:

         简单版本的自动锁随作用域而生,无法解决多分支的加锁和解锁要求,也无法处理递归调用方法的重复加锁,可以给成员增加变量标志是否加锁,同时增加acquire和release接口,避免重复加锁和支持分支加解锁。

         加锁要考虑的问题有:多分支退出,需要保证所有分支均解锁;异常退出,要保证退出作用域时解锁;递归调用,每次递归退出要对应解锁。

         多线程并发编程应该规避无法正常解锁的场景:线程在处理过程中异常应该抛出异常并退出,不应该直接退出线程,直接退出线程不会调用当前堆栈上对象的析构函数,会导致其他活动线程无法获得临界区资源。

  • 相关阅读:
    依赖注入和控制反转概念及目的(新手必读)
    电商秒杀系统可能遇到的坑及思路
    Java中的ReentrantLock和synchronized两种锁定机制的对比
    Java集合---HashMap源码剖析
    Java中的字符串常量池
    redhat7:用户、组和权限
    redhat7下对用户账户的管理
    通过Tacker将NFV引入OpenStack
    github中的一个快捷键
    关于
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/4151357.html
Copyright © 2011-2022 走看看