1

在执行我的多线程程序期间,仅使用了 8 个可用 CPU 中的 4 个。为什么?我可以更改什么以使所有 CPU 正常工作?

  Parallel.ForEach(0, CalcList.Count-1)
  .NumTasks(nMax)
  .NoWait
  .Execute(
    procedure(const value: integer)
    begin
      CalcUnit.EntrySearch(value);
    end);

(nMax 和 CalcList.Count 都是 16,Intel I7 超线程)

谢谢

4

1 回答 1

1

我刚刚使用 OTL 在 i7 2600(4 核 8 HT)上进行了测试。一个简单的Parallel.ForEach循环利用了所有 8 个。有和没有你拥有的 .NumTasks。图书馆没有问题。

begin
  Parallel.ForEach(0, 100)
  //.NumTasks(16)
  .Execute(
    procedure(const value: integer)
    var
      newValue: Single;
      I: Integer;
    begin
      newValue := value;
      for I := 1 to 100000000 do
      begin
        newValue := newValue * I;
        newValue := newValue / I;
      end;
    end);
  ShowMessage('Done!');
end;

我的猜测是问题出在您的代码中。线程中的磁盘访问是首先抵消使用线程的好处的好方法。

我对您的代码知之甚少,但您应该考虑在单个线程中读取数据,然后线程化该数据的实际处理。

我看到您还指定了 .NoWait。您是否在为您的 保存返回值Parallel.ForEach?保存此值是个好主意,否则您的代码将在 OnClick 退出时阻塞。请参阅 gabr 对此问题的回答。

为什么 OmniThreadLibrary 的 ForEach 会阻塞主线程?

于 2014-11-06T22:51:27.297 回答