繁体   English   中英

需要维护订单的多线程作业

[英]Multi-threading jobs that need to maintain order

我的ac / c ++进程队列很长,该队列中的每个元素都需要发送到多个(TCP)服务器。 单线程是一个可行的选项,但是速度很慢。

我需要实现一个多线程解决方案。 我的进程事先不知道服务器的数量。 第一个想法是为每个服务器创建一个线程。 管理器线程读取队列中的新元素,找到目标,然后分派到与目标匹配的线程。

重要说明。 工作可能是依赖的。 如果job_5未完成,我不想执行job_10。 订单需要维护。

首先,我想请您对这个问题发表意见。 其次,我正在搜索C ++实现以供参考。 第三,我正在寻找描述类似问题的书籍/资源。

您看过boost asio吗? 它支持“线程池”的概念,因此您可以拥有一个异步处理大量连接的线程池,而不是每个服务器一个线程(即同步线程)。 性能也不错...

您如何得出需要多线程解决方案的结论? 当您说您的单线程解决方案“缓慢”时,您是什么意思? 您是说在将项目发送到服务器时是否阻止了其他处理(也许是UI东西?)? 还是整个过程花了太长时间?

您的描述在这个问题上是模棱两可的:是否需要将每一项发送到所有服务器,还是只发送到一台? 似乎只有一个,但我不确定。 如果必须将其发送给所有人,那么多线程解决方案的复杂性将大大增加。

一旦发送了项目,您是否可以将其从队列中删除,还是需要等待服务器的确认? 如果必须等待,那么队列管理将变得很棘手-您必须先确认该项目,然后才能删除它,因此您必须以某种方式将其标记为待处理,并且从队列中选择下一个项目的线程将需要确保它不会选择待处理的项目。 当项目成功发送后,必须将其从队列中删除,这意味着对队列的并发写访问。

您如何处理错误? 如果无法发送项目,它是否留在队列中以供以后重试,还是被移至失败列表,还是只是被记录并丢弃了? 在多线程系统中,您将异步了解故障,这意味着同时对错误处理过程进行写访问。

您说您的进程事先不知道有多少台服务器。 这个数字在处理过程中可以更改吗?

一定要研究多线程,但是您可能会发现您的“慢速”单线程解决方案可以最好地满足您的业务需求-易于实现且可靠。 如果没有,那么希望其中的一些问题对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM