这个AnonymousThread的实现是否正确?

时间:2016-11-07 07:07:34

标签: multithreading delphi delphi-xe5

描述这个想法的MCVE如下。有一个类/记录数组有一个方法,它接受一个输入参数并计算一些存储在其变量中的结果:

type
  TMyRecord = record
    FLastResult: double;
    procedure DoHeavyMath(Input: double);
  end;
var
  MyRecordArray:array [0..999] of TMyRecord;
  InputData:array [0..999] of double;
implementation

procedure TMyRecord.DoHeavyMath(Input: double);
begin
  FLastResult:=Input;//Here should be some math
end;

我正在创建匿名线程并限制进程(线程)的数量同时工作。

procedure TForm1.Button1Click(Sender: TObject);
var
  ThreadsCounter, i: word;
begin
  ThreadsCounter := 0;

  for i := 0 to 999 do
  begin
    while ThreadsCounter >= 4 { or other limit } do
    begin
    end;

    inc(ThreadsCounter);
    TThread.CreateAnonymousThread(
      procedure
      begin
        MyRecordArray[i].DoHeavyMath(InputData[i]);
        dec(ThreadsCounter)
      end).Start;
  end;
  repeat
  until ThreadsCounter = 0;
  // return to main thread tasks
end;

这个线程的实现是否正确?

1 个答案:

答案 0 :(得分:2)

不,这不对。 upload_max_filesize上有数据竞争。使用原子函数,例如ThreadsCounter

性能不会很好,因为在创建线程时会产生很大的开销。改为使用线程池,以便可以重用线程。繁忙的循环不能帮助提高性能。