代码应使用C ++编写。我提到这一点是为了防止有人建议使用C ++实施时效率不高的解决方案。
目标:
在线程t1
上运行的 Producer将图像插入在线程t2
上运行的Consumer中。消费者有一个客户列表,他应按不同的时间间隔将图像发送给该客户。例如。 client1每1秒需要一次图像,client2每5秒需要一次图像,等等。
建议的实现:
消费者中有一个主队列imagesQ
,生产者将图像排入队列中。除了主队列之外,使用者还管理队列clientImageQs
的向量队列的列表,该列表的大小作为客户端的数目。消费者为每个客户端创建一个在其自己的线程上运行的子消费者。每个这样的子消费者都会从clientImageQs
的相关队列中取出图像,并以一定的间隔将图像发送到其客户端。
每次有新图像到达imagesQ
时,消费者都会对其进行复制并排队到clientImageQs
中的每个队列中。这样,每个子消费者将能够按自己的频率将图像发送给其客户端。
潜在问题和解决方案:
如果生产者以比子消费者之一出队列更高的速率入队图像,队列将爆炸。但是,使用者可以在入队前检查clientImageQs
中队列的大小。而且,如果需要,消费者可以在将新图像放入队列之前先将其排空。
问题
这是一个好的设计还是有一个更好的设计?
答案 0 :(得分:0)
您在一组已确定的解决方案限制内描述问题。您的描述很复杂,令人困惑,我敢说很困惑。 为什么有一个使用者仅从共享缓冲区中分发图像?为什么不让每个“客户端”在调用时根据需要从缓冲区读取? 为什么不将共享缓冲区实现为单映像缓冲区。生产者以其速度写作。客户端以自己的速率执行缓冲区的非破坏性读取。每当客户端读取缓冲区时,确保每个客户端读取缓冲区中的最新图像。生产者每次写操作都会简单地覆盖缓冲区。 多元素队列在此应用程序中没有任何好处。实际上,正如您所描述的,它使解决方案非常复杂。 请参见http://sworthodoxy.blogspot.com/2015/05/shared-resource-design-patterns.html查找标题“无条件缓冲区”。 上面列出的帖子中的示例都是使用Ada实现的,但是与并发设计模式有关的概念适用于所有支持并发的编程语言。