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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章