业务逻辑写多了,有些基础的东西就忘了,写在这里仅仅是做个笔记。

最近要把自己的程序改成多线程,其中有一个缓冲区类,大概是这样的:

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

posted on 2022-03-20 17:39  coding my life  阅读(800)  评论(1编辑  收藏  举报