如何在不违反const正确性的情况下使用std :: lock_guard?

w12*_*128 9 c++ multithreading constants

在一个子类中,我有一个私有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;
}
Run Code Online (Sandbox Code Playgroud)

编译器通过产生错误告诉我这违反了const正确性:

错误:将'const std :: mutex'绑定到类型'std :: lock_guard :: mutex_type&{aka std :: mutex&}'的引用将丢弃限定符

有没有办法使这种兼容并std::lock_guard以const正确的方式使用?只需改变它就不会const std::lock_guard改变任何东西 我真的不明白哪个部分有问题,然后我再次对C++很新...

Rak*_*111 23

this指针是隐式const(它实际上是类型的右值const SubClass *),所以您要访问的任何成员都const含蓄.

如果你可以修改一个const函数中的成员对象,那会是什么意思const呢?:)

锁定防护装置想要修改互斥锁,锁定和解锁它,但因为它是const,它不能,这就是问题所在.锁定防护装置是否const合适并不重要,因为这与锁定防护装置修改互斥锁的能力无关.

为了有效地解决此问题,可以使用一个关键字来标记可在const限定函数中修改的成员对象.显然,你不应该滥用这个功能并用它来标记你班级的每个对象:

class SubClass {
/*...*/
private:
    mutable std::mutex m;
  //^^^^^^^
/*...*/
}; 
Run Code Online (Sandbox Code Playgroud)

  • 只是为了挑选(嘿,这是C++),`this`不是const指针.也就是说,类型仍然是`const SubClass*` - 它的值只是一个rvalue,所以你不能赋值给它.这就好像编译器提供了一个魔术宏`#define this(this_ + 0)`,并且函数的隐藏参数被命名为`this_`.http://coliru.stacked-crooked.com/a/a92dbf35021f8758 (4认同)