Chinaunix首页 | 论坛 | 博客
  • 博客访问: 711876
  • 博文数量: 176
  • 博客积分: 2548
  • 博客等级: 少校
  • 技术积分: 1749
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-29 16:36
个人简介

爱咋咋地

文章分类

全部博文(176)

文章存档

2024年(1)

2023年(17)

2022年(19)

2021年(3)

2020年(1)

2018年(1)

2017年(1)

2014年(1)

2013年(4)

2012年(11)

2011年(19)

2010年(22)

2009年(71)

2008年(5)

分类: C/C++

2009-12-27 20:30:44

c++中 mutable 关键字的典型应用
原来一直很少用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;
};
阅读(2336) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~