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

Concurrency 简单的生产者-消费者问题,但生产者更新旧的缓冲区,concurrency,producer-consumer,Concurrency,Producer Consumer,假设我有两个缓冲区。生产者填充缓冲区#1,然后填充 缓冲区#2。消费者一次只消耗一个缓冲区,这非常简单 慢点。当它消耗缓冲区#1时,生产者准备填充 另一个缓冲区,但它们都已满,而消费者还没有 以#1结束。因此,制作人等待 我希望制作人更新“空闲”缓冲区,而不是等待。 也就是说,当消费者消耗缓冲区#1时,生产者 应在缓冲区#2准备就绪后立即将新数据写入缓冲区#2( “旧”数据被覆盖并丢失)。如果消费者还没有完成 然而,有了#1,制作人有更多的数据要写,它应该写 再来看#2,依此类推。 当使用者最终

假设我有两个缓冲区。生产者填充缓冲区#1,然后填充 缓冲区#2。消费者一次只消耗一个缓冲区,这非常简单 慢点。当它消耗缓冲区#1时,生产者准备填充 另一个缓冲区,但它们都已满,而消费者还没有 以#1结束。因此,制作人等待

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

(假设制作人正在高速实时获取视频帧,而消费者正在慢慢地制作视频帧;消费者不介意跳过一些视频帧 帧,但它必须始终处理获取的最后一帧 相反,生产商不能放慢速度,也不能等待,因为它必须获得利润 每帧)

有没有办法用信号量做这种事情?这是一口井吗- 已知并发问题?万一发生这种情况,是否有可能延长 是否将此问题添加到n>2个缓冲区


谢谢

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

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


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

不幸的是,对于n=2个缓冲区的情况,我也需要解决方案(当缓冲区非常大而内存不是时,我可能会被迫只使用两个缓冲区,以消耗速度为代价)。