Delphi并行吗?例如,有MaxParallism吗

Delphi并行吗?例如,有MaxParallism吗,delphi,delphi-10.1-berlin,omnithreadlibrary,Delphi,Delphi 10.1 Berlin,Omnithreadlibrary,在C#中,可以限制线程数,如下所示: Parallel.For(0, 10, new ParallelOptions { MaxDegreeOfParallelism = 4 }, count => { Console.WriteLine(count); }); Delphi是否在最新的编译器(如柏林)中有此功能。或者omnithreadlibrary具有此功能?使用接受的,并提供限制线程数量的线程池。这是通过该方法完成的 请注意,我是通过阅读 或者omnithreadlibra

在C#中,可以限制线程数,如下所示:

Parallel.For(0, 10, new ParallelOptions { MaxDegreeOfParallelism = 4 }, count =>
{
    Console.WriteLine(count);
});
Delphi是否在最新的编译器(如柏林)中有此功能。或者omnithreadlibrary具有此功能?

使用接受的,并提供限制线程数量的线程池。这是通过该方法完成的

请注意,我是通过阅读

或者omnithreadlibrary有这个

它也有

如果您从
Parallel.For
构造函数开始,那么您将获得
iomnipallelosimpleloop
接口,该接口具有
.NumTasks
方法,默认为CPU核心计数。如果使用
.NoWait
调用从当前执行线程分离循环,则可能会对其进行调整

无论您是从
Parallel.ForEach
生成器开始,您都会获得
IOMNIAllelLoop
接口,并且它也有
numtask

见第2.12.4章和第2.11.1章

有关预期调用语法的一般概念,请参见

应该是这样的

Parallel.ForEach(0, 10 (* ,1 *) )
  .NumTasks( 4 )
  .Execute(
    procedure (const elem: integer)
    begin
      WriteLn( elem );
    end
  );

这个问题比你想的更有意义。第一个Tparallel设计为仅在特定情况下工作。例如

这与tparallel有很好的关系

 TParallel.For(1, Max, procedure (I: Integer)
   begin
     Do_processor_intensive_work
   end);
这必须避免:

 TParallel.For(1, Max, procedure (I: Integer)
   begin
     do_waiting_proc_like_downloading_url
   end);
为什么??这就是我回答你问题的地方:这是因为Tparallel创建的线程数量与系统上可用的处理器数量(虚拟或物理)相匹配。所以,如果您有32个处理器,那么它将创建最多32个线程,如果您只有1个处理器,那么它将只创建一个线程。这对所有应用程序来说也是全局的,如果你有两个线程,每个线程都做Tparalell,那么每个处理器不会有多个线程

因此,Tparallel的理念是,您不需要担心线程的数量,系统会为您选择最佳的线程数量。但正如您在我的示例中看到的,如果您的tparallel不是处理器密集型的,那么您可能需要比可用处理器数量更多的线程,在这种情况下,我强烈建议避免tparallel,而使用TanonymousThread

您可以通过执行SetMaxWorkerThreads(默认情况下是处理器的数量)来覆盖此数字,但如果需要执行此操作,您必须避免使用Tparallel,而需要使用TanonymousThread