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

时间:2014-08-27 07:45:14

标签: c++ thread-safety const qmutex

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

但是由于QMutex的使用,我无法标记状态访问的函数 如果const没有使用mutable。捕获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;
}

1 个答案:

答案 0 :(得分:18)

Herb Sutter对此主题有一个很好的talk on Channel9

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

因此,拥有mutable互斥锁并从const成员函数访问它并不是很骇人听闻,而且它实际上是mutable的主要用途之一。