05 连接池 消费连接线程

文章讲述了在实现一个连接池管理类时,如何利用智能指针(特别是`shared_ptr`)和自定义删除器来避免在析构时直接删除连接资源,而是将其归还到连接池中。通过lambda表达式确保了线程安全的队列操作,当从连接池获取连接并使用完毕后,连接会被刷新存活时间并放回队列。此外,当连接池为空时,通过条件变量等待或超时机制处理连接获取。
摘要由CSDN通过智能技术生成

        消费者线程,给外部提供接口,从连接池中获取一个可用的空闲连接

        使用智能指针,出作用域自动析构,默认会直接把我们的connection资源delete掉了,相当于调用connection的析构函数,但是我们并不想直接删除,而是将其返回到我们的连接池中所以需要我们自定义他的析构函数(智能指针自定义删除器)

        使用lambda表达式,

shared_ptr<Connection> sp(_connectionQue.front(), 
		[&](Connection *pcon) 
		{
			// 这里是在服务器应用线程中调用的,所以一定要考虑队列的线程安全操作
			unique_lock<mutex> lock(_queueMutex);
			pcon->refreshAliveTime(); // 刷新一下开始空闲的起始时间
			_connectionQue.push(pcon); // 
	    });
//给外部提供接口,从连接池中获取一个可用的空闲连接
shared_ptr<Connection> ConnectionPool::getConnection() {

	unique_lock<mutex> lock(_queueMutex); //锁

	//队列为空
	while (_connectionQue.empty()) {
		//超时
		if (cv_status::timeout == cv.wait_for(lock, chrono::milliseconds(_connectionTimeout)))
		{
			if (_connectionQue.empty()) //超时醒来发现还是空的 
			{
				LOG("获取空间连接超时了。。。获取连接失败!");
				return nullptr;
			}
		}
	}

	/*
	* share_ptr智能指针析构时,会把connection资源直接delete掉,相当于调用connection的析构函数,connection就被close掉了
	* 这里需要自定义shared_ptr的释放资源的方式,把connection直接归还到queue中
	*/
	//队列不为空 ---- 消费连接
	shared_ptr<Connection> sp(_connectionQue.front(), 
		[&](Connection *pcon) 
		{
			// 这里是在服务器应用线程中调用的,所以一定要考虑队列的线程安全操作
			unique_lock<mutex> lock(_queueMutex);
			pcon->refreshAliveTime(); // 刷新一下开始空闲的起始时间
			_connectionQue.push(pcon); // 
	    });

	_connectionQue.pop(); //消费掉头部

	if (_connectionQue.empty()) //消费掉头部后 队列变为空 
	{
		//谁消费了队列中最后一个connection,谁负责通知一下生产连接
		cv.notify_all(); 
	}
	return sp;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值