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

时间:2009-06-04 21:13:42

标签: concurrency producer-consumer

假设我有两个缓冲区。生产者填充缓冲区#1,然后填充 缓冲区#2。消费者一次消耗一个缓冲区,而且非常 慢。虽然它正在消耗缓冲区#1,但生产者已准备好填充 另一个缓冲区,但它们都已满,而消费者则没有 完成了#1。所以,制作人等待。

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

(想象一下制作人正在高速实时获取视频帧,而消费者正在慢慢地对它们进行详细阐述;消费者并不介意它是否会跳过一些 帧,但它必须始终处理获取的最后一帧。该 相反,生产者不能放慢速度,也不能等待,因为它必须获得 每一帧)。

有没有办法用信号量做这种事情?这是一个好的 - 已知的并发问题?并且,万一,是否可以扩展 这个问题到n> 2个缓冲区?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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