可以将互斥锁定功能标记为const

era*_*lan 13 c++ const thread-safety qmutex

我有Document代表自定义文档的线程安全类.它有getter(const函数)和setter来修改它的状态.所有这些函数都受互斥保护,以保证在完全执行该方法之前文档不会更改.

但由于QMutex使用,我无法将状态访问功能标记为constmutable使用.捕捉QMutex改变它的状态.

这段代码是正确的,还是可以用更好的方式编写?没有hacky mutable使用.

class Document
{
    // This method should be const: it changes only mutex
    // and don't touch document state
    bool IsCorrect() const;
    ...
    mutable QMutex m_lock;
};

bool Document::IsCorrect() const
{
    // Capturing mutex object change it!
    QMutexLocker lock( &m_lock );
    ... Const-aware code
    bool result = ( m_context != NULL );
    ...
    return result;
}
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 19

Herb Sutter 在Channel9上就这一主题进行了精彩的演讲.

与此相关的一点是,在C++ 11中,mutable已经获得了关于线程安全的新含义:"此数据成员在内部同步." 这正是互斥体的意义所在.在谈到互斥体时,赫伯甚至在谈话中说道:"它想变得可变."

因此,拥有一个mutable互斥锁并从const成员函数访问它并不是hacky,而且它实际上是主要的预期用途之一mutable.