04 连接池类成员方法 生产线程函数

类成员方法生产线程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();
	}
}

使用条件变量做线程的通信,判断队列是否为空,以及创建新连接后通知消费者线程使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值