C语言,环形队列
答案是不行的,生产者生产水的速度是不知道的,消费者消费水的速度也是不知道的,如果你强制接在一起,因为生产和消费的速度不同,就非常可能存在水管爆炸的情况,你说这样危险不危险?
在音频系统框架下,alsa就是使用环形队列的,在生产者和消费者速度不匹配的时候,就会出现xrun的问题。
二、环形队列的特点
1、数组构造环形缓冲区
假设我们用数组来构造一个环形缓存区,如下图所示:
从图片看,我们知道,这个环形缓冲区的读写位置是指向数组的首地址的,环形缓冲区的长度是 5 。
(资料图)
那如何判断环形缓冲区为空呢?
如果 R == W 就是读写位置相同,则这个环形缓冲区为空
那如何判断环形缓冲区满了呢?
如果 (W - R )= Len ,则这个环形缓冲区已经满了。
2、向环形缓冲区写入3个数据
写入 3 个数据后,W 的值等于 3 了,R 还是等于 0。
3个企鹅已经排列~
3、从环形缓冲区读取2个数据
读出两个数据后,R = 2 了,这个时候,W还是等于 3,毕竟没有再写过数据了。
4、再写入3个数据
如果 W > LEN 后,怎么找到最开始的位置的呢?这个就需要进行运算了,W%LEN 的位置就是放入数据的位置 ,6%5 = 1。
5、再写入1个数据
这个时候环形队列已经满了,要是想再写入数据的话,就不行了,(W - R) = 5 == LEN
三、代码实现
换一个写法,这个写法是各种大神级别的:
四、总结
标签:
为您推荐
-
人民网杭州9月17日电 (记者孙博洋)9月16日至17日,中国质量(杭州)大会在浙江杭州举行。在16日举行...
2021-09-18