业务逻辑写多了,有些基础的东西就忘了,写在这里仅仅是做个笔记。
最近要把自己的程序改成多线程,其中有一个缓冲区类,大概是这样的:
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