Производительность сна - PullRequest
       19

Производительность сна

4 голосов
/ 20 сентября 2010

Я занимаюсь разработкой программы на c ++, и мне нужно реализовать cron. Этот cron должен выполняться каждый час и каждые 24 часа по разным причинам. Моя первая идея состояла в том, чтобы сделать независимый pthread и спать в течение 1 часа каждый раз. Это правильно? Я имею в виду, действительно ли эффективно иметь нить, спящую больше, чем бодрствовать? Какие неудобства от того, что спит нить?

Ответы [ 4 ]

4 голосов
/ 20 сентября 2010

Я бы предпочел, чтобы такая задача выполнялась через cron / планировщик, так как она должна выполняться с заданными интервалами, а не в ответ на какое-либо событие среды. Таким образом, программа должна просто «делать» то, что ей нужно, а затем запускаться операционной системой по мере необходимости. Это также позволяет легко изменять частоту выполнения - просто измените расписание, вместо того, чтобы перестраивать приложение или предоставлять дополнительные возможности настройки.

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

Вызовы Sleep () обычно не будут исключительно точными, поскольку время, в течение которого поток спит; это зависит от того, какие задачи ожидают другие потоки и т. д.

3 голосов
/ 20 сентября 2010

Нет никакого влияния на производительность при длительном спящем потоке, за исключением того факта, что он будет занимать некоторую память, не делая ничего полезного. Может быть, , если бы вы делали это для тысяч потоков, в управлении потоками в ОС было бы некоторое замедление, но не похоже, что вы планируете это делать.

Практическим недостатком долгого сна является то, что вы ничего не можете с ним сделать. Если вы, например, хотите сообщить потоку, что он должен остановиться, потому что приложение хочет завершить работу, поток может получить это сообщение только после сна. Таким образом, ваше приложение должно либо очень долго закрываться, либо поток должен быть принудительно остановлен.

2 голосов
/ 20 сентября 2010

Моя первая идея состояла в том, чтобы сделать независимую веточку и спать в течение 1 часа каждый раз.

Не вижу проблем.

Это правильно? Я имею в виду, действительно ли эффективно, чтобы нить спала больше, чем проснулась?

Пока поток спит и не просыпается, ОС даже не беспокоится о его существовании.

Хотя в противном случае, если поток спит большую часть своей жизни, зачем иметь выделенный поток? Почему другой поток (например, основной поток) не может проверить время и запустить поток для выполнения работы cron?

Какие неудобства от того, что спит нить?

Отсутствует. Но тот факт, что спящая нить не может быть легко разблокирована. Это вызывает беспокойство, если нужно правильно закрыть приложение. Вот почему лучше иметь другой (занятый) поток для проверки времени и запуска задания cron при необходимости.

1 голос
/ 20 сентября 2010

При проектировании вашего решения учитывайте следующие сценарии:

  • В 07:03 системное время сбрасывается на 06:59.Что происходит через минуту?
  • В 07:03 системное время переводится на 07:59.Что происходит через минуту?
  • В 07:59 системное время переводится на 08:01.Выполняется ли когда-нибудь задание 08:00?

Ответы на эти вопросы многое расскажут вам о том, как вы должны реализовать свое решение.

Производительность решения не должнабыть проблемой.Один спящий поток будет использовать минимальные ресурсы.

...