2014-08-27 68 views
13

我有線程安全的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; 
} 
+9

這種'mutable'的使用不是「hacky」......它正是可變的(但不是唯一的 - 例如緩存結果,儀器是同樣有效的用途)。 – 2014-08-27 07:46:43

+0

另一個'mutable'的例子可能是一個緩存(外部狀態的內部表示),它在讀出時可以刷新,所以即使讀取函數是const,緩存也可以改變,但這並不意味着對象已經改變。 – stefaanv 2014-08-27 07:57:58

+0

@TonyD我的負責人說「像const函數一樣不能改變任何東西 - 而互斥體是Document狀態的一部分,隱含地改變它是令人困惑的」。我應該向他解釋一下邏輯和按位常數嗎? – eraxillan 2014-08-27 08:35:00

回答

18

香草薩特有一個很好的talk on Channel9關於這個問題。

與此相關的一點是,在C++ 11中,mutable已經獲得了關於線程安全性的新含義:「此數據成員在內部同步。」這正是一個互斥體。 Herb甚至在談到互斥體的時候說:「它想要變化。」

所以具有mutable互斥並且從const成員函數訪問它不是哈克在所有,並且它在實際上對於mutable初級預期用途之一。

+0

好的,我是現在冷靜 但是,我發現基於互斥體的設計並不是最好的,但這是另一個問題。 – eraxillan 2014-08-27 08:38:07