2010-07-13 62 views
27

是否有關於每當本質上只讀的方法,但可能需要修改的互斥鎖/鎖,常量或不是的約定?C++互斥鎖和常量的正確性

如果沒有一個,這將是不利的/糟糕的設計,如果這種方法是const

謝謝

+0

我認爲它取決於類的語義:在不同的情況下,不同的方法可能是有意義的。 – 2010-07-13 17:53:05

+0

爲什麼你不想讓它成爲常量? – 2010-07-13 17:54:08

+0

@Neil我有印象,應該避免mutable,但似乎互斥體是一個很好的候選人使用它,所以我想聽聽它是否好設計 – Anycorn 2010-07-13 17:57:15

回答

41

您可以用關鍵字mutable標記數據成員,讓他們在不斷進行修改成員函數,例如:

struct foo 
{ 
    mutable mutex foo_mutex; 
    // .... 
    void bar() const 
    { 
     auto_locker lock(foo_mutex); 
     // ... 
    } 
}; 

嘗試這樣做盡可能少的,因爲濫用mutable是邪惡的。

+2

謝謝。我猜這個問題是關於設計的,而不是如何實現 – Anycorn 2010-07-13 17:51:13

+0

aaa @將互斥數據成員標記爲mutable,這是一種可接受的用例,因爲它不代表對象的真實狀態。 – 2010-07-13 17:54:11

+1

在我們的產品中,這個關鍵字被使用了三次,其中三個正好是'可變boost :: mutex'。有一天我會弄清楚如何擺脫其他兩個。 – Cubbi 2010-07-13 17:54:39

11

對於概念上爲const的方法,我通常可以使用mutable鎖和緩存。

特別是在緩存性能計算結果的情況下。這是嚴格意義上的實現細節,不應該成爲調用者關心的問題,因此刪除const指定將等於抽象中的小泄漏。

用鎖,我會問自己,如果鎖只是一個私人實現細節。如果鎖與其他對象共享,那麼它實際上是接口的一部分。

在某些平臺上,通過句柄訪問鎖,因此您可以在方法上使用const而不用擔心mutable