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

时间:2018-01-07 00:09:21

标签: 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;
}

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

  

错误:绑定&#39; const std :: mutex&#39;参考类型   &#39;的std :: lock_guard :: mutex_type&安培; {aka std :: mutex&amp;}&#39;丢弃   限定符

有没有办法使这个符合并以const正确的方式使用std::lock_guard?只需将其更改为const std::lock_guard即可。我真的不明白哪个部分有问题,然后我再次对C ++很陌生......

1 个答案:

答案 0 :(得分:14)

this指针隐含const(它实际上是const SubClass *类型的右值),因此您正在访问的任何成员都是const隐式。

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

锁定后卫想要修改互斥锁,锁定和解锁它,但因为它是const,它不能,这就是问题所在。锁定防护装置是否const无关紧要,因为这与防护装置修改互斥锁的能力无关。

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

class SubClass {
/*...*/
private:
    mutable std::mutex m;
  //^^^^^^^
/*...*/
};