消费者线程,给外部提供接口,从连接池中获取一个可用的空闲连接
使用智能指针,出作用域自动析构,默认会直接把我们的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;
}