【问题标题】:How to get the lowest cpu consumption when having an infinite loop in a thread线程中存在无限循环时如何获得最低的cpu消耗
【发布时间】:2012-03-16 13:17:32
【问题描述】:

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

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

我的代码对于每个线程都是这样的

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

【问题讨论】:

  • 请添加您的 Delphi 版本。这对于线程相关的问题很重要。
  • @TLama 我的delphi版本是XE2
  • 重复的your own question?
  • 这个问题比上一个问题要好,因为上一个问题关注的是“低优先级”。

标签: multithreading delphi delphi-xe2


【解决方案1】:

通常线程应该休眠直到收到信号,但使用SleepSleepEx

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

Sleep 引起了很多问题,包括我所说的“睡美人”病。您的应用程序的整个其余部分已经终止并关闭了几百microseconds,并且您的线程在相对计算机时间方面已经休眠了“百万年”,当它唤醒时,您的应用程序的其余部分早已终止.您的后台线程可能要做的下一件事是访问它引用的某个对象,该对象被冻结,然后(如果幸运的话)它将崩溃。不要在线程中使用Sleep。等待事件,或使用一些预先构建的工作线程(例如 OmniThreadLibrary)。

【讨论】:

  • 如果您的线程正在执行代码(除了睡眠),它可能在应用程序终止后仍然这样做。一个简单的循环或一个复杂的操作也可能需要几秒钟,在此期间没有与应用程序的其余部分交互。所以从这个意义上说,睡眠并不坏。如果您的线程在睡眠后崩溃,它也可能在另一个操作之后(或期间)崩溃。不是说在线程中使用 sleep 很好,但你描述的原因也不是。
  • Windows 在释放任何资源之前停止应用程序退出时的所有线程。 Sleep() 在线程中很好用——几十年来我一直在使用它(为了它的正确目的,而不是作为通信挑战应用程序中的轮询拐杖)。
  • '如果你的线程正在执行代码(除了睡眠),它可能在应用程序终止后仍然这样做' - 不,它不能。所有线程要么设置它们的状态,以便它们永远不会再次运行,要么如果在与退出的内核不同的内核上运行,则让它们的处理器中断以停止它们。当所有线程都停止时,资源被释放。
  • 有一种情况我可以想到 sleep() 可能会导致关机问题 - 如果睡眠线程唤醒并尝试直接写入表单(或其上的组件),该表单具有已经被释放,那么一个 AV 是可能的,(再一次,应用程序正在关闭,所以只是转储异常:)。不做像写表格这样讨厌的事情会有很大帮助!
  • @GolezTrol - 为您的逻辑 +1。应用程序终止后,任何线程都无法运行。睡眠、运行、等待 - 线程在释放内存、句柄等之前都停止了。不过我不能错你的逻辑 - “如果 sleep() 是一个问题,那么其他正在运行的线程也应该是一个问题”。跨度>
【解决方案2】:

我有一些无限循环,我怎样才能获得最低的 CPU 消耗?

通过阻塞循环直到有事可做。

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

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

【讨论】:

    猜你喜欢
    • 2012-09-25
    • 2012-11-11
    • 1970-01-01
    • 2011-12-15
    • 2017-09-10
    • 2012-07-20
    • 2023-04-07
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多