c++中 mutable 关键字的典型应用

1 篇文章 0 订阅


原来一直很少用mutable这个关键字,最近遇到了一个自己觉得很合适应用mutable的地方:
在多线程环境里面,有一个Config类中保存了很多的配置属性。
 
这些属性有可能在某些地方会被修改,在其它的地方会被读取,
因为在多线程环境中要避免数据冲突所以要加上读写锁。这些应该是毫无疑问的
class Config{
public:
    Config(){
        pthread_rwlock_init( &m_rwlock, NULL );
    }
    void SetParm1(const string& parm){
        pthread_rwlock_wrlock( &m_rwlock );
        m_parm1 = parm;
        pthread_rwlock_unlock(&m_rwlock);
        return;
    }
    const string& GetParm1(){
        pthread_rwlock_rdlock( &m_rwlock );
        const string& tmp = m_parm1;
        pthread_rwlock_unlock(&m_rwlock);
        return tmp;
    }
    void SetParm2(const string& parm){
        pthread_rwlock_wrlock( &m_rwlock );
        m_parm2 = parm;
        pthread_rwlock_unlock(&m_rwlock);
        return;
    }
    const string& GetParm2(){
        pthread_rwlock_rdlock( &m_rwlock );
        const string& tmp = m_parm2;
        pthread_rwlock_unlock(&m_rwlock);
        return tmp;
    }
private:
    pthread_rwlock_t m_rwlock;
    string m_parm1;
    string m_parm2;
};
 
我们在只执行读取操作的地方,把这个实例的指针或者引用指定为const,也是合情合理的。
void SomeFunc( const Config& cfg ){
    cout << cfg.GetParm1() << endl;
    cout << cfg.GetParm2() << endl;
    return;
}
 
这样的话 GetParm1()和GetParm2()应该在类定义中被定义为:
    const string& GetParm1() const;
    const string& GetParm1() const;
 
但这样的话,代码是编译不了的,因为m_rwlock 在被加锁时是会被改变的,所以需要给m_rwlock 加上mutable 关键字,使之可以在const函数中被修改。
 
class Config{
public:
    Config(){
        pthread_rwlock_init( &m_rwlock, NULL );
    }
    void SetParm1(const string& parm){
        pthread_rwlock_wrlock( &m_rwlock );
        m_parm1 = parm;
        pthread_rwlock_unlock(&m_rwlock);
        return;
    }
    const string& GetParm1() const{
        pthread_rwlock_rdlock( &m_rwlock );
        const string& tmp = m_parm1;
        pthread_rwlock_unlock(&m_rwlock);
        return tmp;
    }
    void SetParm2(const string& parm){
        pthread_rwlock_wrlock( &m_rwlock );
        m_parm2 = parm;
        pthread_rwlock_unlock(&m_rwlock);
        return;
    }
    const string& GetParm2() const{
        pthread_rwlock_rdlock( &m_rwlock );
        const string& tmp = m_parm2;
        pthread_rwlock_unlock(&m_rwlock);
        return tmp;
    }
private:
    mutable pthread_rwlock_t m_rwlock;
    string m_parm1;
    string m_parm2;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值