Как получить минимальное потребление ресурсов процессора при наличии бесконечного цикла в потоке - PullRequest
7 голосов
/ 16 марта 2012

1.У меня есть бесконечные циклы, как я могу получить самое низкое потребление процессора? Должен ли я использовать задержку?

2.Если в моем приложении запущено несколько потоков, и один из них - THREAD_PRIORITY_IDLE, влияет ли он на другие потоки?

Мой код таков для каждой темы

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

Ответы [ 2 ]

9 голосов
/ 16 марта 2012

Обычно поток должен находиться в спящем режиме до тех пор, пока не получит сигнал, но не с использованием Sleep или SleepEx.

Вы создаете событие и ждете, пока оно будет сигнализировано, либо с помощью TEvent , либо напрямую в Win32 API с помощью WaitForSingleObject .

Sleep вызывает так много проблем, включая то, что я называю болезнью "Спящей красавицы". Вся остальная часть вашего приложения была прервана и закрыта несколько сотен микросекунд назад, и ваш поток просуществовал «миллион лет» в относительном компьютерном измерении времени, и когда он пробуждает остальную часть вашего приложения давно прекратилось. Следующее, что может сделать ваш фоновый поток, - это получить доступ к некоторому объекту, на который он ссылается, который был заморожен, а затем (если вам повезет) он потерпит крах. Не используйте Sleep в темах. Дождитесь событий или используйте предварительно созданный рабочий поток (например, OmniThreadLibrary).

6 голосов
/ 16 марта 2012

У меня есть несколько циклов infinte. Как я могу получить наименьшее потребление процессора?

Блокируя цикл до тех пор, пока есть что сделать.

ЕслиВ моем приложении запущено несколько потоков, и один из них THREAD_PRIORITY_IDLE влияет на другие потоки?

.. зависит.Вероятно, нет, но если какие-либо другие потоки ожидают вывода из этого потока или снятия блокировки с него, то другие потоки также эффективно «перетаскиваются» до THREAD_PRIORITY_IDLE.
Помимо этого приоритетаинверсия (которая может вызвать взаимоблокировку, когда потоки имеют несколько уровней приоритета), спин-блокировки, конструкция синхронизации, которая обычно только плоха, может привести к катастрофическим последствиям.

...