c++ - const 强制转换以允许读取锁定,这闻起来难闻吗?

标签 c++ concurrency constants

我想在标记为 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/

相关文章:

c++ - 调试堆栈损坏问题

c++ - OpenCV 通过帧平均减去背景

python - 如何在 APScheduler 中使用 Tornado?

java - 外部服务触发异步任务并立即返回。如何判断任务何时真正完成?

c++ - Eigen 3.2.1 + MKL = C4244 编译器警告

c++ - 将 boost::signal 作为 boost::function 传递

java - "Atomically"更新整个数组

C - 获取最小可能的有符号整数

检查字符串是否可以在 C 中改变

c++ - 包装类常量正确性问题