类成员方法定时线程scannerConnectionTask
之前在定义Connection每一个连接的时候我们定义了一个
clock_t _alivetime; // 记录进入空闲状态后的起始存活时间
并且我们提供了一些接口
// 刷新一下连接的起始的空闲时间点
void refreshAliveTime() { _alivetime = clock(); }
// 返回存活的时间
clock_t getAliveeTime()const { return clock() - _alivetime; }
所以我们需要在每一个Connection对象进入队列的时候,对其连接时间进行一个记录或者说更新
比如在连接池的构造函数处:
生产者线程处:
释放连接时:
通过我们每一个连接对象调用我们的返回存活时间getAliveeTime()函数,判断最大空闲时间是否超时,超时就释放连接。
//扫描超过maxIdleTime时间的空闲连接,进行对于的连接回收
void ConnectionPool::scannerConnectionTask(){
for (;;) {
//通过 sleep模拟定时效果
this_thread::sleep_for(chrono::seconds(_maxIdleTime));
//扫描整个队列,释放多余的连接
unique_lock<mutex> lock(_queueMutex);
while (_connectionCnt > _initSize) {
Connection* p = _connectionQue.front(); //指向对头
if (p->getAliveeTime() >= (_maxIdleTime * 100))
{
_connectionQue.pop();
_connectionCnt--;
delete p;
}
else
{
break; //队头的连接没有超过 _maxIdleTim 其他连接肯定没有
}
}
}
}