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

标签 c++ multithreading constants

在一个子类中,我有一个私有(private)的 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 正确性:

error: binding 'const std::mutex' to reference of type 'std::lock_guard::mutex_type& {aka std::mutex&}' discards qualifiers

有没有办法让它符合要求并以常量正确的方式使用 std::lock_guard?简单地将其更改为 const std::lock_guard 不会有任何改变。我真的不明白哪一部分有问题,然后我又是 C++ 的新手 ...

最佳答案

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

如果您可以在const 函数中修改成员对象,那么const 的意义何在? :)

锁守卫想要修改互斥锁,锁定和解锁它,但是因为它是const,所以它不能,这就是问题所在。 lock guard 是否为const 并不重要,因为这与lock guard 修改互斥体的能力无关。

为了有效解决这个问题,有一个关键字可以用来标记在const限定函数中可以修改的成员对象。现在很明显,你不应该滥用这个特性并用它标记你类的每个对象:

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

关于c++ - 如何在不违反 const 正确性的情况下使用 std::lock_guard?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48133164/

相关文章:

c++ - `cin >> variable` 不等待输入

Python 多处理异步无法终止进程

ruby - 为什么 Array.constants 不显示 Object 类中的常量列表?

javascript - Node 和 Chrome (V8) block 范围内的 const

c - 在C中查找变量的名称

c++ - 如何在 C++ 中声明一个字符串而不赋值?

c++ - 最大缩减 Openmp 2.0 Visual Studio 2013/C++

c++ - 如何将我的程序读入 C++ 中的平面文件?

c - 有没有办法从另一个进程向线程发送信号?

java - TheApplyAsync 与 CompletableFuture 使用与 SupplyAsync 线程相同的线程