如何在不违反常量正确性的情况下使用 std::lock_guard
How to use a std::lock_guard without violating const correctness?
在子类中,我有一个私有std::mutex m
字段,我在基类纯虚拟方法的实现中使用它以线程安全的方式返回值(该值可以由另一个线程更新(:
int SubClass::get() const // implements 'virtual int get() = 0 const' of the base class
{
std::lock_guard<std::mutex> lck(m);
return value;
}
编译器告诉我,这通过产生错误违反了const正确性:
错误:将"const std::mutex"绑定到类型的引用 'std::lock_guard::mutex_type& {aka std::mutex&}' discard 限定 符
有没有办法使其合规并以恒定正确的方式使用std::lock_guard
?简单地将其更改为const std::lock_guard
不会改变任何事情。我真的不明白哪个部分有问题,然后我对C++又很陌生......
this
指针是隐式const
的(它实际上是类型 const SubClass *
的右值(,因此您正在访问的任何成员都是隐式const
。
如果可以在const
函数中修改成员对象,那么const
的意义何在? :)
卫想要修改互斥锁,锁定和解锁它,但因为它是const
,所以它不能,这就是问题所在。锁护罩是否const
并不重要,因为这与锁护罩修改互斥锁的能力无关。
为了有效地解决此问题,可以使用一个关键字来标记可以在const
限定函数中修改的成员对象。现在很明显,你不应该滥用这个功能并用它标记类的每个对象:
class SubClass {
/*...*/
private:
mutable std::mutex m;
//^^^^^^^
/*...*/
};
相关文章:
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 在 std::tie 中使用 std::weak_ptr::lock()
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- std::lock 仍然导致死锁
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 当我调用lock()时,为什么std :: mutex会引发异常
- 使用 std::lock (c++11) 的大量 CPU 负载
- std::lock() equivalent for boost::shared_mutex?
- 为什么在 std::lock 中没有超时支持
- “std::mutex”和“std::lock”是否保证处理器间代码中的内存同步
- std::weak_ptr:lock或shared_ptr构造函数
- std::mutex::lock可以抛出即使一切看起来"good"?
- std::weak_ptr.lock在多线程c++中的语义
- STD::Lock 的友元函数定义和替代提升函数
- 什么是更好的 std::lock_guard<std::mutex> lock(std::mutex mutex_var); 或 std::mutex mutex_var.lock();
- 尝试std::lock[_unique]和std::shared_mutex的线程是否会被调用std::lock_sha
- C++std::lock和std::unique_lock之间有什么区别