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;
};
阅读(2383) | 评论(0) | 转发(0) |