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

opc*_*0de 7 delphi multithreading delphi-xe2

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

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

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

procedure TMatchLanLon.Execute;
begin
 while not Terminated do
  begin
          //some code
          Sleep(1000);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

War*_* P 9

通常情况下,线程应该睡眠,直到发出信号,但使用SleepSleepEx.

您创建一个事件并等待它发出信号,使用TEvent或使用WaitForSingleObject直接指向Win32 API .

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

  • 如果您的线程正在执行代码(睡眠除外),则在应用程序终止后仍可执行此操作.简单的循环或复杂的操作也可能需要几秒钟,在此期间不与应用程序的其余部分进行交互.所以睡觉在这个意义上并不坏.如果您的线程在睡眠后崩溃,它也可能在另一个操作之后(或期间)崩溃.不,说在线程中使用睡眠是好的,但你描述的原因也不是. (4认同)
  • 在取消分配任何资源之前,Windows会停止应用程序退出时的所有线程.Sleep()在线程中表现得很好 - 几十年来,我一直在使用它(为了它的正确目的,而不是作为一个通信挑战应用程序中的轮询拐杖). (4认同)

Mar*_*mes 6

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

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

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

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