Delphi OTL为什么MultiThreading程序只使用一半的可用CPU

时间:2014-11-06 18:30:35

标签: multithreading delphi omnithreadlibrary

在执行我的多线程程序期间,只使用了4个可用的8个CPU。为什么? 我可以改变什么来使所有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 HyperThreaded)

谢谢

1 个答案:

答案 0 :(得分: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对此问题的回答。

Why is OmniThreadLibrary's ForEach blocking main thread?