C++互斥和const正确性

Any*_*orn 41 c++

是否存在关于何时基本上只读的方法,但具有可能需要修改的互斥锁/锁定的约定,是否为常量?

如果没有一个,如果这样的方法是什么将是不利/坏设计 const

谢谢

snk*_*kid 62

您可以使用关键字标记数据成员,mutable以允许在常量成员函数中修改它们,例如:

struct foo 
{
    mutable mutex foo_mutex;
    // ....
    void bar() const
    {
        auto_locker lock(foo_mutex);
        // ...
    }
};
Run Code Online (Sandbox Code Playgroud)

尝试尽可能少地这样做,因为滥用mutable是邪恶的.

  • @aaa在我们的代码库中我们也使用mutable作为互斥数据成员,另一个可接受的用例是引用计数对象我的意思是实际引用计数成员.另一种可接受的用例是使用"is_dirty"标志的延迟评估对象. (4认同)
  • 谢谢.我想这个问题实际上是关于设计而不是如何实现 (2认同)
  • 在我们的产品中,这个关键字使用了三次,三个中的一个完全是`mutable boost :: mutex`.有一天,我会弄清楚如何摆脱其他两个. (2认同)

Adr*_*thy 14

mutable对于概念上的方法,我通常可以使用锁和缓存const.

特别是在缓存性能计算结果的情况下.这严格来说是一个实现细节,不应该被调用者关注,因此删除const指定将等同于抽象中的小泄漏.

有了锁,我会问自己锁是否只是一个私有的实现细节.如果锁与其他对象共享,那么它实际上是接口的一部分.

在某些平台上,通过句柄访问锁,因此您可以使用const该方法而无需担心mutable.