我有代表自定义文档的线程安全的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;
}
答案 0 :(得分:18)
Herb Sutter对此主题有一个很好的talk on Channel9。
与此相关的一点是,在C ++ 11中,mutable
在线程安全方面获得了新的含义:“此数据成员在内部同步。”这正是互斥体的意义所在。在谈到互斥体时,赫伯甚至在谈话中说道:“它想变得可变。”
因此,拥有mutable
互斥锁并从const
成员函数访问它并不是很骇人听闻,而且它实际上是mutable
的主要用途之一。