如何在线程中拥有无限循环时获得最低的CPU消耗

时间:2012-03-16 13:17:32

标签: multithreading delphi delphi-xe2

1.我有一些无限循环如何才能获得最低的CPU消耗?我应该延迟吗?

2.如果我的应用程序中运行了多个线程,其中一个是THREAD_PRIORITY_IDLE会影响其他线程吗?

我的代码就像每个线程一样

procedure TMatchLanLon.Execute;
begin
 while not Terminated do
  begin
          //some code
          Sleep(1000);
  end;
end;

2 个答案:

答案 0 :(得分:9)

通常情况下,线程应该一直处于睡眠状态,直到发出信号,但使用SleepSleepEx

您可以使用TEvent创建一个事件并等待其发出信号,或使用WaitForSingleObject直接发送到Win32 API。

Sleep导致了很多问题,包括我称之为“睡美人”的疾病。你的整个应用程序已经终止并关闭了几百microseconds之前,你的线程在相对的计算机时序条件下已经睡了“百万年”,当它醒来时,你的应用程序的其余部分已经很长时间了自终止。你的后台线程可能要做的下一件事是访问一个它引用的对象,它被冻结,然后(如果你很幸运)它会崩溃。不要在线程中使用Sleep。等待事件,或使用一些预先构建的工作线程(如OmniThreadLibrary)。

答案 1 :(得分:6)

  

我有一些infinte循环如何才能获得最低的CPU消耗?

通过阻止循环直到有事情要做。

  

如果我的应用程序中运行了多个线程,其中一个是THREAD_PRIORITY_IDLE会影响其他线程吗?

..取决于。可能不是,但是如果任何其他线程正在等待来自该线程的输出,或者从其中释放锁定,则其他线程被有效地拖下来'到THREAD_PRIORITY_IDLE也是如此 除了这种优先级倒置(当线程具有多个优先级时可能导致死锁),自旋锁(通常只是坏的同步构造)可能会变得灾难性。