06 连接池定时回收线程

类成员方法定时线程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 其他连接肯定没有
			}

		} 
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值