这个 AnonymousThread 的实现是否正确?
Is This Implementation of AnonymousThread Correct?
描述这个想法的 MCVE 如下。有一个 classes/records 的数组,它有一个方法,该方法接受一个输入参数并计算存储在其变量之一中的一些结果:
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;
这个线程的实现是否正确?
不,这是不正确的。 ThreadsCounter
上存在数据竞争。请改用原子函数,例如 AtomicDecrement
。
性能不会很好,因为创建线程时会产生大量开销。请改用线程池,以便可以重新使用线程。繁忙的循环不会对性能有一点帮助。
描述这个想法的 MCVE 如下。有一个 classes/records 的数组,它有一个方法,该方法接受一个输入参数并计算存储在其变量之一中的一些结果:
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;
这个线程的实现是否正确?
不,这是不正确的。 ThreadsCounter
上存在数据竞争。请改用原子函数,例如 AtomicDecrement
。
性能不会很好,因为创建线程时会产生大量开销。请改用线程池,以便可以重新使用线程。繁忙的循环不会对性能有一点帮助。