我想在标记为 const
的对象上执行只读方法,但为了线程安全地执行此操作,我需要锁定读写器互斥体:
const Value Object::list() const {
ScopedRead lock(children_);
...
}
但这会中断,因为编译器提示“children_”是 const
等等。我去了 ScopedRead 类和 RWMutex 类(children_
是一个子类)以允许 read_lock
在 const 对象上,但我必须写这个:
inline void read_lock() const {
pthread_rwlock_rdlock(const_cast<pthread_rwlock_t*>(&rwlock_));
}
我一直了解到 const_cast
是一种代码味道。有什么办法可以避免这种情况?
最佳答案
使锁可变
mutable pthread_rwlock_t rwlock;
这是使用 mutable 的常见场景。对象的只读查询(顾名思义)是一种不需要非常量访问的操作。当您希望能够修改对象的不可见部分或对该对象具有可观察到的副作用时,可变被认为是一种很好的做法。您的锁用于确保顺序访问对象的数据,并且更改它不会影响对象中包含的数据,也不会对以后的调用产生明显的副作用,因此它仍然尊重对象的常量性。
关于c++ - const 强制转换以允许读取锁定,这闻起来难闻吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2157510/