我正在尝试设计和实现一个程序来“解决”经典的生产者-消费者问题。我还将使用发布/订阅模式,并且只有一个生产者。
我想到的第一件事是将每件事都作为一个单独的线程来实现,但后来我意识到这是低效的,可能有更聪明的方法可以做到这一点。
我需要:
- 接受来自客户端的 tcp/ip 连接
- 使用来自另一个进程的命名管道获取数据(命名管道可以在此处更改为其他任何内容)
- 一旦我得到数据就决定哪些客户应该得到它并将它发送到那里
- 能够随时解析客户端命令(例如,客户端想要更改订阅详细信息)
- 还取决于实现细节,我可能想清除包含传入数据的集合(如果我只需要一个)并踢非活动客户端
我现在的想法是:
- 创建一个将接受来自客户端的连接并将每个客户端添加到列表中的线程
- 创建一个线程/线程池,这些线程将执行 strand(
boost::strand
),其中包括从源读取数据、决定哪个客户端应该获取数据以及将数据异步写入客户端。
我不知道如果
- 这是有效的方法
- 这是有效的方法
- 如何添加来自客户端的读取命令?
- 如何检查客户端不活动
对于如何正确实施此类事情的任何意见和建议,我将不胜感激。