首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的生产者-消费者问题,但生产者更新旧缓冲区

简单的生产者-消费者问题,但生产者更新旧缓冲区
EN

Stack Overflow用户
提问于 2009-06-04 21:13:41
回答 1查看 1.7K关注 0票数 0

假设我有两个缓冲器。生产者填充缓冲区#1,然后填充缓冲区#2。使用者每次消耗一个缓冲区,速度非常慢。当它正在消耗缓冲区#1时,生产者已经准备好填充另一个缓冲区,但是它们都已经满了,并且使用者还没有完成第1缓冲区。所以,生产者等待。

我希望生产者更新“免费”缓冲区,而不是等待。也就是说,当使用者使用缓冲区#1时,生产者应该在缓冲区#2上写入新数据(“旧”数据被覆盖和丢失)。如果消费者还没有完成#1,而生产者有更多的数据要写,它应该再次写在#2上,以此类推。当使用者最终使用#1中的所有数据时,它应该立即开始使用缓冲区#2中新写的数据,并且生产者应该继续更新#1。

(想象一下,生产商正在以高速实时获取视频帧,而消费者正在缓慢地对其进行详细阐述;消费者并不介意跳过某个帧,但它必须始终处理最后获得的帧。相反,生产者不能慢下来,也不能等待,因为它必须获得每一个帧)。

有办法用信号灯做这种事吗?这是众所周知的并发问题吗?在这种情况下,是否可以将这个问题扩展到n>2缓冲区?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-04 21:18:53

好吧,你可以有一个缓冲区(队列)的缓冲区。某种类型的同步队列结构,以确定正在使用哪些缓冲区。这将适用于n个>= 2缓冲区。

我猜它会像这样工作:生产者开始写缓冲区1,但不会从队列中删除它。使用者从缓冲区1开始消费,并从队列中删除它。缓冲区1满后,生产者将检查队列以确定哪些缓冲区可用,而它只看到缓冲区2可用。当缓冲区2满时,它会再次检查队列,并看到缓冲区2仍然可用,所以它会再次写入。一旦使用者完成了缓冲区1,它将从队列中移除缓冲区2,并将缓冲区1放回。一旦生产者完成了2,它将看到只有缓冲区1是可用的,并开始写入它。我希望这就是你所描述的。(我不喜欢只处理信号量,我更喜欢使用更高的数据结构,例如。排队)。

若要处理多个生产者,请引入另一个队列以确定生产者正在使用哪些缓冲区。现在,您将有一个生产者队列和一个消费者队列,我认为这可以处理所有的情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/953136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档