【问题标题】:Delphi 2007 AsyncMultiSync Does not workDelphi 2007 AsyncMultiSync 不工作
【发布时间】:2015-10-08 07:25:45
【问题描述】:

我尝试使用AsyncCalls 编写一个并行线程示例,以下是并行计算素数的个数

program Project3;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Math,
  Windows,
  AsyncCalls in 'AsyncCalls.pas';

const
  N = 1000000;
  MAXT = 100;

var
  threads : array of IAsyncCall;
  ans: array of integer;
  cnt: DWORD;
  i, v, j, k, portion: integer;

function IsPrime(x: integer): boolean;
var
  i: integer;
begin
  if (x <= 1) then 
  begin
    Result := False;
    Exit;
  end;
  if (x = 2) then
  begin
    Result := True;
    Exit;
  end;
  for i:= 2 to Ceil(Sqrt(x))do
  begin
    if (x mod i = 0) then
    begin
      Result := False;
      Exit;
    end;
  end;
  Result := True;
end;

procedure DoWork(left, right: integer; value: PInteger); cdecl;
var
  i, cnt: integer;
begin
  cnt := 0;
  for i := left to right do
  begin
    if (IsPrime(i)) then
    begin
      Inc(cnt);
    end;
  end;
  value^ := cnt;
end;

begin
  // Paralell
  cnt := GetTickCount;
  SetLength(ans, MAXT);
  SetLength(threads, MAXT);
  portion := N div MAXT;
  for i := 0 to MAXT - 2 do
  begin
    // left index
    j := i * portion;
    // right index
    k := (i + 1) * portion - 1;
    threads[i] := AsyncCall(@DoWork, [j, k, @ans[i]]);
  end;
  // last thread
  j := (MAXT - 1) * portion;
  threads[MAXT - 1] := AsyncCall(@DoWork, [j, N - 1, @ans[MAXT - 1]]);
  // Join, doesn't seem to wait all
  AsyncMultiSync(threads, True, INFINITE);
  // ****Adding a delay to wait for all threads*****
  // Sleep(1000);
  // Sum the answer
  v := 0;
  for i := 0 to MAXT - 1 do
  begin
    Inc(v, ans[i]);
  end;
  Writeln('Parallel = ', GetTickCount - cnt);
  Writeln('Answer = ', v);  
  // Serial
  cnt := GetTickCount;
  DoWork(0, N - 1, @v);
  Writeln('Serial = ', GetTickCount - cnt);
  Writeln('Answer = ', v);  
  Readln;
end.

奇怪的行为。 AsyncMultiSync 似乎根本没有等待。如果我不添加 Sleep(1000),则输出为

Parallel = 172
Answer = 0
Serial = 453
Answer = 78498

如果我添加 Sleep(1000),则输出正确:

Parallel = 1188
Answer = 78498
Serial = 265
Answer = 78498

我尝试使用threads[i].Sync,它产生了类似的结果。

我错过了什么吗?

环境为 D2007,Windows 10 64-bit Home

【问题讨论】:

  • 你没有检查AsyncMultiSync的返回值。
  • 即使有 INFINITE 参数?
  • 文档说:The function returns when all listed async calls have finished. If Milliseconds is INFINITE the async calls meight be executed in the current thread. The return value is zero when all async calls have finished. Otherwise it is WAIT_FAILED.

标签: multithreading delphi delphi-2007


【解决方案1】:

Documentation 表示不要超过等待对象的最大数量,61。

因此,您将不得不减少 MaxT 常量。

【讨论】:

  • 谢谢!没想到会这样。是的,在我将 MAXT 设置为 61 后,它按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多