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

时间:2011-01-31 21:30:15

标签: c++ c multithreading pthreads threadpool

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

我需要实现多线程解决方案。我的过程事先并不知道这个号码 服务器第一个想法是为每个服务器创建一个线程。经理线程读取 队列中的新元素查找目标并调度到与目标匹配的线程。

一个重要的注意事项。乔布斯可能依赖。如果job_5没有完成,我不想执行job_10。需要维护订单。

首先,我想就此问题发表意见。其次,我正在寻找C ++实现以供参考。第三,我正在寻找描述类似问题的书籍/来源。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

您对这个问题的描述含糊不清:每个项目都需要发送到所有服务器,还是只发送给一个服务器?似乎只有一个,但我不确定。如果必须将其发送给所有人,那么多线程解决方案的复杂性就会大大增加。

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

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

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

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