C++使用mutable在const成員函式中加鎖
阿新 • • 發佈:2022-03-20
業務邏輯寫多了,有些基礎的東西就忘了,寫在這裡僅僅是做個筆記。
最近要把自己的程式改成多執行緒,其中有一個緩衝區類,大概是這樣的:
class Buffer { public: /** * 獲取當前緩衝區中已分配的chunk數量及總記憶體,用於統計 */ void get_mem_info(int& chunk_size, int& mem_size) const { std::lock_guard<SpinLock> lg(_lock); chunk_size = _chunk_size; mem_size = _chunk_size * sizeof(Chunk); } private: SpinLock _lock; int _chunk_size; };
這個比較簡單,我原本只想寫個函式,獲取當前緩衝區物件的資訊用於統計,因為僅僅是獲取,所以用了const
函式。不過由於是多執行緒,就得加個鎖,沒想到編譯直接報錯了:
error C2664: “std::lock_guard<SpinLock>::lock_guard(_Mutex &)”: 無法將引數 1 從“const SpinLock”轉換為“_Mutex &”
with
[
_Mutex=SpinLock
]
轉換丟失限定符
由於函式是const
的,那麼成員變數_lock
lock_guard
加鎖是要修改_lock
變數的,這顯然衝突了。我原本想直接改成非const函數了事,不過直覺告訴我這本來就是一個get函式,沒有修改到類本身的業務邏輯變數(_lock不算,它和具體的業務邏輯沒關係)應該是能實現const的,這樣嚴謹一些。一找就找到了這麼多年來自己一直沒用過的mutable
關鍵字。
mutable
允許在const物件中修改被標記為mutable
的成員變數,見cppreference.com