0

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

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

(假设生产者正在高速实时获取视频帧,而消费者正在缓慢地处理它们;消费者不介意跳过某些帧,但它必须始终处理获取的最后一帧。相反,生产者不能减速也不等待,因为它必须获取每一帧)。

有没有办法用信号量做这种事情?这是一个众所周知的并发问题吗?而且,以防万一,是否可以将此问题扩展到 n > 2 个缓冲区?

谢谢!

4

1 回答 1

0

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

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

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

于 2009-06-04T21:18:53.087 回答