我想在C ++ Builder中使用TParallel::For
,但想知道在此循环中默认使用了多少个线程?例如,如果我有1000个可以并行完成的迭代,那么是否可以一次创建1000个线程来执行它们,或者任何时候最大线程数都受逻辑处理器数量的限制?
我的意思是-我不想TParallel::For
一次创建更多线程,而CPU无法支持。那么,如果CPU支持8个线程,那么这些迭代将以8乘8的方式执行,直到全部执行1000个迭代,还是一次创建1000个线程?
答案 0 :(得分:2)
默认池处理程序同时查找计算机资源和计算机负载。
来自docs(重点是我):
RTL提供了并行编程库(PPL),使您的应用程序能够利用跨多个CPU设备和计算机的工作,使任务并行运行。 PPL包括许多用于运行任务,加入任务,等待任务组等进行处理的高级功能。为此,有一个线程池会自动进行自我调整(基于CPU的负载),因此您不必担心为此创建或管理线程。
如果您想控制池的使用,可以define your own pool:
当指定了TThreadPool类型的APool参数时,程序作者通过使用其TThreadPool.SetMinWorkerThreads和TThreadPool.SetMaxWorkerThreads方法来控制TParallel的迭代事件可用的线程资源。在调用这些方法时,建议同时线程太多会产生开销,从而减少或消除了并行执行例程的好处。
默认的线程池初始化有以下限制:
FMinLimitWorkerThreadCount := TThread.ProcessorCount;
FMaxLimitWorkerThreadCount := TThread.ProcessorCount * MaxThreadsPerCPU;
MaxThreadsPerCPU
是设置为25的常数。因此,根据处理器负载,池中使用的线程在这些数字之间变化。