業務邏輯寫多了,有些基礎的東西就忘了,寫在這里僅僅是做個筆記。
最近要把自己的程序改成多線程,其中有一個緩沖區類,大概是這樣的:
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