我有線程安全的Document
類代表自定義文檔。 它有getters(const函數)和setter來修改它的狀態。 所有這些函數都受互斥鎖保護,以保證文檔不會更改 ,直到方法完全執行。互斥鎖功能是否可以標記爲const
但由於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;
}
這種'mutable'的使用不是「hacky」......它正是可變的(但不是唯一的 - 例如緩存結果,儀器是同樣有效的用途)。 – 2014-08-27 07:46:43
另一個'mutable'的例子可能是一個緩存(外部狀態的內部表示),它在讀出時可以刷新,所以即使讀取函數是const,緩存也可以改變,但這並不意味着對象已經改變。 – stefaanv 2014-08-27 07:57:58
@TonyD我的負責人說「像const函數一樣不能改變任何東西 - 而互斥體是Document狀態的一部分,隱含地改變它是令人困惑的」。我應該向他解釋一下邏輯和按位常數嗎? – eraxillan 2014-08-27 08:35:00