假设我有两个缓冲器。生产者填充缓冲区#1,然后填充缓冲区#2。使用者每次消耗一个缓冲区,速度非常慢。当它正在消耗缓冲区#1时,生产者已经准备好填充另一个缓冲区,但是它们都已经满了,并且使用者还没有完成第1缓冲区。所以,生产者等待。
我希望生产者更新“免费”缓冲区,而不是等待。也就是说,当使用者使用缓冲区#1时,生产者应该在缓冲区#2上写入新数据(“旧”数据被覆盖和丢失)。如果消费者还没有完成#1,而生产者有更多的数据要写,它应该再次写在#2上,以此类推。当使用者最终使用#1中的所有数据时,它应该立即开始使用缓冲区#2中新写的数据,并且生产者应该继续更新#1。
(想象一下,生产商正在以高速实时获取视频帧,而消费者正在缓慢地对其进行详细阐述;消费者并不介意跳过某个帧,但它必须始终处理最后获得的帧。相反,生产者不能慢下来,也不能等待,因为它必须获得每一个帧)。
有办法用信号灯做这种事吗?这是众所周知的并发问题吗?在这种情况下,是否可以将这个问题扩展到n>2缓冲区?
谢谢!
发布于 2009-06-04 21:18:53
好吧,你可以有一个缓冲区(队列)的缓冲区。某种类型的同步队列结构,以确定正在使用哪些缓冲区。这将适用于n个>= 2缓冲区。
我猜它会像这样工作:生产者开始写缓冲区1,但不会从队列中删除它。使用者从缓冲区1开始消费,并从队列中删除它。缓冲区1满后,生产者将检查队列以确定哪些缓冲区可用,而它只看到缓冲区2可用。当缓冲区2满时,它会再次检查队列,并看到缓冲区2仍然可用,所以它会再次写入。一旦使用者完成了缓冲区1,它将从队列中移除缓冲区2,并将缓冲区1放回。一旦生产者完成了2,它将看到只有缓冲区1是可用的,并开始写入它。我希望这就是你所描述的。(我不喜欢只处理信号量,我更喜欢使用更高的数据结构,例如。排队)。
若要处理多个生产者,请引入另一个队列以确定生产者正在使用哪些缓冲区。现在,您将有一个生产者队列和一个消费者队列,我认为这可以处理所有的情况。
https://stackoverflow.com/questions/953136
复制相似问题