gas*_*ard 6 c++ concurrency const
我想对标记为的对象执行只读方法const,但为了安全地执行此操作,我需要锁定一个reader-writer互斥锁:
const Value Object::list() const {
ScopedRead lock(children_);
...
}
Run Code Online (Sandbox Code Playgroud)
但这打破了因为编译器抱怨"children_"存在const等等.我去了ScopedRead类,直到RWMutex类(这children_是一个子类)来允许read_lockconst对象,但我必须写这个:
inline void read_lock() const {
pthread_rwlock_rdlock(const_cast<pthread_rwlock_t*>(&rwlock_));
}
Run Code Online (Sandbox Code Playgroud)
我一直都知道这const_cast是一种代码味道.有什么办法可以避免这个吗
RC.*_*RC. 13
使锁可变
mutable pthread_rwlock_t rwlock;
Run Code Online (Sandbox Code Playgroud)
这是使用mutable的常见场景.对象的只读查询(顾名思义)是一种不需要非const访问的操作.当您希望能够修改对象的不可见或具有可观察的副作用的部分时,Mutable被认为是一种很好的做法.您的锁用于确保对对象数据的顺序访问,并且更改它不会影响对象中包含的数据,也不会对以后的调用产生可观察的副作用,因此它仍然遵循对象的常量.