如何控制程序正在处理的线程数?
我有一个现在可以进行多线程处理的程序但是一个问题是该程序非常耗费内存,我必须限制运行的线程数,这样我就不会用完ram。主程序通过并创建了一大堆句柄和处于挂起状态的关联线程。
我希望程序激活一定数量的线程,当一个线程完成时,它将自动取消挂起下一个线程,直到所有工作完成。我该怎么做?
有人曾经提到有关使用线程处理程序的事情,但我似乎无法找到有关如何编写一个或确切如何工作的任何信息。
如果有人可以提供帮助,我们将不胜感激。
使用windows和visual c ++。 注意:我不需要担心传统的线程访问问题,每个线程完全相互独立,更像是批处理而不是程序的真正的多线程。
谢谢,
-Faken
答案 0 :(得分:2)
不要显式创建线程。创建一个线程池,请参阅Thread Pools并使用QueueUserWorkItem对您的工作进行排队。线程池大小应根据可用的硬件线程数(内核数和超线程比)以及工作项的CPU与IO的比率来确定。通过控制线程池的大小,可以控制最大并发线程数。
答案 1 :(得分:2)
一个Suspended线程不使用CPU资源,但它仍然消耗内存,所以你真的不应该创建比你想要同时运行更多的线程。
最好只拥有与最大同时任务数一样多的线程,并使用队列将工作单元传递给工作线程池。
您可以使用Windows Thread Pool API为Windows创建的标准线程池提供工作。
请注意,您将使用流程中的所有代码共享这些线程以及用于向其提交工作的队列。如果出于某种原因,您不希望与进程中的其他代码共享工作线程,那么您可以创建FIFO queue,创建任意数量的线程,以便同时运行 并让他们每个人将工作项目拉出队列。如果队列为空,则它们将阻塞,直到将工作项添加到队列中。
答案 2 :(得分:0)
这里有很多话要说 有几种方式 您应该只在计划同时运行时创建尽可能多的线程句柄,然后在完成时重用它们。 (查找线程池) 这可以保证您永远不会同时运行太多。这就提出了一个线程完成时资金的问题。您可以在线程终止之前调用回调,其中该回调中的参数是刚刚完成的线程句柄。使用Boost绑定和增强信号。调用回调时,查找该线程句柄的另一个任务并重新启动该线程。这样你所要做的就是添加到“要执行的任务”列表中,回调将为你删除任务。不需要轮询,也不用担心线程过多。