类成员方法生产线程produceConnectionTask
该方法定义为类成员方法可以方便的使用类中参数,该线程用于判断连接队列中是否还有连接可以用,如果当前需要任务但池中无空闲连接,且目前连接总数没有超过最大连接数量,使用该线程继续创建新的连接。
//运行在独立的线程中,专门负责生产新连接 生产者线程
void ConnectionPool::produceConnectionTask() {
for (;;) {
unique_lock<mutex> lock(_queueMutex); //锁
while (!_connectionQue.empty()) {
cv.wait(lock); //队列不为空,阻塞操作 此处生产线程进入等待状态 等待期间释放lock 放在循环中防止虚假唤醒
}
// 连接数量没有到达上限,继续创建新的连接
if (_connectionCnt < _maxSize) {
Connection* p = new Connection();
p->connect(_ip, _port, _username, _password, _dbname);
p->refreshAliveTime(); // 刷新一下开始空闲的起始时间
_connectionQue.push(p);
_connectionCnt++; // 连接数量++
}
// 通知消费者线程,可以消费连接了
cv.notify_all();
}
}
使用条件变量做线程的通信,判断队列是否为空,以及创建新连接后通知消费者线程使用。