13

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

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

这段代码是正确的,还是可以用更好的方式编写?没有hackymutable用法。

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;
}
4

1 回答 1

23

Herb Sutter在 Channel9 上就这个话题进行了精彩的演讲。

这里相关的一点是,在 C++11 中,mutable线程安全有了新的含义:“这个数据成员是内部同步的”。这正是互斥锁的含义。Herb 甚至在那次谈话中谈到互斥体时说:“它想要是可变的。”

因此,拥有一个mutable互斥锁并从const成员函数访问它一点也不难,而且它实际上是mutable.

于 2014-08-27T07:52:41.993 回答