1. 程式人生 > 其它 >C++使用mutable在const成員函式中加鎖

C++使用mutable在const成員函式中加鎖

業務邏輯寫多了,有些基礎的東西就忘了,寫在這裡僅僅是做個筆記。

最近要把自己的程式改成多執行緒,其中有一個緩衝區類,大概是這樣的:

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