2010-01-31 144 views
1

如何控制我的程序正在处理的线程数?多线程线程控制

我有一个程序,现在准备mutithreading但一个问题是,这项计划是非常内存密集型,我必须要限制运行,这样我就不会用完RAM的线程数。主程序通过并创建一大堆处于暂停状态的句柄和相关的线程。

我想程序启动线程的一组号码,当一个线程完成,直到所有的工作已经完成,它会自动解除暂停行中的下一个线程。我该怎么做呢?

有人曾经提到一些有关使用一个线程处理,但我似乎无法找到关于如何写一个或会究竟是如何工作的任何信息。

如果任何人都可以提供帮助,将不胜感激。

使用windows和visual C++。 注意:我不需要担心与线程访问的传统问题,每个线程都是完全独立的,它更像批处理,而不是程序的真正的多线程处理。

感谢,

-Faken

回答

2

不明确创建线程。创建一个线程池,请参阅Thread Pools并使用QueueUserWorkItem排队工作。线程池大小应该由可用硬件线程的数量(内核数量和超线程比率)以及您的工作项目所执行的CPU与IO的比率来确定。通过控制线程池的大小,您可以控制最大并发线程数。

0

这里有这么多话要说。
有几种方法
您应该只创建多达你打算在同一时间运行的线程处理,然后当他们完全重复使用。 (查找线程池)。
这保证你永远不会有太多的同时运行。这提出了一个线程完成时出资的问题。您可以在线程终止之前调用一个回调函数,该回调函数中的参数就是刚刚完成的线程句柄。使用Boost绑定和提升信号。当回调被调用时,查找该线程句柄的另一个任务并重新启动该线程。这样你所要做的就是添加到“要做的任务”列表中,并且回调会为你删除任务。不需要轮询,也不用担心太多的线程。

2

暂停的线程不使用的CPU资源,但它仍然消耗内存,所以你真的不应该创建多个线程比你想同时运行。

最好只有最多同时执行任务数量的线程,并使用队列将工作单元传递到工作线程池。

您可以将工作交给使用Windows Thread Pool API由Windows创建的标准线程池。

请注意,您将与您的流程中的所有代码共享这些线程和用于向他们提交工作的队列。如果出于某种原因,您不想与您的流程中的其他代码共享您的工作线程,那么您可以创建一个FIFO queue,创建尽可能多的线程,以便同时运行并让它们中的每一个都拉出工作项目不在队列中。如果队列为空,它们将阻塞,直到工作项添加到队列中。