我正在开发一个需要处理大量数据的C ++应用程序。我无法对数据进行分区,因此多进程可以独立处理每个分区。我希望得到关于可以在工作线程之间管理线程和工作分配的框架/库的想法。
管理线程至少应包含以下功能 1.确定需要多少工作线程。我们可能需要提供用户定义的函数来计算线程数 2.创建所需的线程数 3.杀死/停止不必要的线程以减少资源浪费 4.监控每个工作线程的健康状况。
工作分配应包括以下功能 1.使用回调功能,图书馆应该完成一项工作 2.将工作分配给可用的工作线程 3.应该可以使用主/从配置或工作线程管道。
非常感谢提前。
答案 0 :(得分:1)
您的问题基本上归结为“我如何实现线程池?”
编写一个好的线程池很棘手。我建议寻找一个已经做你想做的图书馆,而不是试图自己实现它。 Boost在审阅队列中有一个线程池库,Microsoft的并发运行时和Intel的线程构建块都包含线程池。
关于您的具体问题,大多数平台都提供了获取处理器数量的功能。在C ++ 0x中,这是std::thread::hardware_concurrency()
。然后,您可以将其与有关要选择多个工作线程的工作的信息结合使用。
由于在许多平台上创建线程实际上非常耗时,并且被阻塞的线程不会消耗超出其堆栈空间和线程信息块的大量资源,我建议您只是阻止工作线程而无需对条件变量进行操作或类似的同步原语,而不是在第一个实例中杀死它们。但是,如果您最终得到大量空闲线程,则可能是您的池有太多线程的信号,并且您可以减少等待线程的数量。
监视每个线程的“健康性”是棘手的,并且通常依赖于平台。最简单的方法是检查(a)线程是否仍在运行,并且没有意外死亡,以及(b)线程正在以可接受的速率处理任务。
向线程分配工作的最简单方法就是使用单个共享作业队列:将所有任务添加到队列中,并且每个线程在完成上一个任务时执行任务。一个更复杂的替代方案是每个线程都有一个队列,并且有一个工作窃取方案,允许线程在其任务用完时从其他线程中获取工作。
如果您的线程可以将任务提交到工作队列并等待结果,那么您需要有一个方案来确保您的工作线程不会停止等待尚未安排的任务。一个选项是在任务被阻塞时生成一个新线程,另一个选项是以递归方式直接运行阻塞该线程上给定线程的尚未调度的任务。这些方案以及其他替代方案都有优点和缺点。