Base——BlockingQueue类、BoundedBlockingQueue类

本文介绍了BlockingQueue和BoundedBlockingQueue两类队列,其中BlockingQueue是无界缓冲区,BoundedBlockingQueue是有界缓冲区。两者在生产者消费者模型中发挥作用,使用信号量或条件变量实现线程间的同步。BlockingQueue的take()方法不需通知生产者,而BoundedBlockingQueue在队列满时会阻塞生产者。文章提供了相关测试代码以供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.成员变量

BlockingQueue:无界缓冲区
在这里插入图片描述

BoundedBlockingQueue:有界缓冲区
在这里插入图片描述

  • queue_:循环队列

2.生产者、消费者模型

利用信号量实现伪码:

//生产者
p(semFull)		//查看队列是否有空间
	lock(mutex)
	queue.push(物品)
	unlock(mutex)
v(semEmpty)		//通知消费者有物品
//消费者
p(semEmpty)		//查看对列中是否有物品
	lock(mutex)
	queue.pop()
	unlock(mutex)
v(semFull)		//通知生产者有空间

利用条件变量实现伪码:

//生产者
while(queue.full())
{
	notFull.wait();
}

lock(mutex)
queue.push(物品)
unlock(mutex)

notEmpty.signal();
while(queue.empty())
{
	notEmpty.wait();
}

lock(mutex)
queue.push(物品)
unlock(mutex)

notFull.signal();
  • BlockingQueue类、BoundedBlockingQueue类中通过put()往(循环)队列中放元素,通过take()取元素

BlockingQueue类:
在这里插入图片描述

  • 注:由于该类实现的队列无界,所以take()函数末尾无需向生产者信号

BoundedBlockingQueue类:
在这里插入图片描述

3.测试代码 BlockingQueue_test.cc、BlockingQueue_bench.cc、BoundedBlockingQueue_test.cc

参考代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值