Лучший способ замедлить поток? Использование Sleep () в порядке?
================================================================

Мы написали библиотеку C ++, которая выполняет серьезную тяжелую работу с процессором (все это - математические вычисления и вычисления) и, если оставить ее на свое собственное устройство, будет легко потреблять 100% всех доступных ресурсов процессора (это 's также многопоточный на количество доступных логических ядер на машине).

Таким образом, у меня есть обратный вызов внутри основного цикла вычислений, который программное обеспечение, использующее библиотеку, должно вызывать:

В обратном вызове клиент вызывает Sleep (x), чтобы замедлить поток.

Первоначально клиентский код представлял собой фиксированный вызов Sleep (100), но это приводило к плохой ненадежной производительности, поскольку некоторые машины заканчивали математику быстрее, чем другие, но режим ожидания одинаков на всех машинах. Итак, теперь клиент проверяет системное время, и если прошло более 1 секунды (что == несколько итераций), он будет спать в течение полсекунды.

Это приемлемый способ замедления потока? Должен ли я использовать семафор / мьютекс вместо Sleep (), чтобы максимизировать производительность? Хорошо ли спит х миллисекунд за каждую 1 секунду обработки или что-то не так?я не заметил?

Причина, по которой я спрашиваю, состоит в том, что машина по-прежнему сильно перегружена, даже если таскман показывает, что процесс занимает ~ 10% процессорного времени. Я'Мы уже исследовали конфликты жесткого диска и памяти безрезультатно, так что теперь ямне интересно, если я такм замедление потока вызывает эту проблему.

Спасибо!

 которое из ваших комментариев - то, что выпосле. Возможно, вам просто нужно уточнить, как долго вы спите.

Единственное программное обеспечение, в котором я использую такую функцию, это[BOINC клиент](https://boinc.berkeley.edu/trac/wiki/SourceCode), Я нене знаю, какой механизм он использует, но этос открытым исходным кодом и мультиплатформенность, так что помогите себе.

У него есть опция конфигурации ("ограничить использование процессора до X%). Как яя ожидаю реализовать то, что использовать платформо-зависимые API, такие как`clock()` или же`GetSystemTimes()`и сравните время процессора с прошедшим временем настенных часов. Сделайте немного реальной работы, проверьте,больше или ниже номинала, и если выпереспать на некоторое время, чтобы вернуться под.

Клиент BOINC хорошо играет с приоритетами и не• не вызывает проблем с производительностью других приложений даже при максимальной загрузке процессора. Причина, по которой я использую дроссель, заключается в том, что в противном случае клиент все время запускает центральный процессор и увеличивает скорость вращения вентилятора и уровень шума. Поэтому я запускаю его на уровне, когда вентилятор работает тихо. С лучшим охлаждением я бы не сталэто не нужно :-)



 не очень сложный, метод может заключаться в том, чтобы рассчитать время одной итерации и дать потоку спать в течение (x * t) миллисекунд до следующей итерации, где t - это время в миллисекундах для одной итерации, а x - выбранная доля времени ожидания (между 0 и 1).



т вы используете более низкий приоритет для расчета потоков? Это обеспечит планирование других потоков, а потоки вычислений будут работать максимально быстро, если другие потоки не нужно запускать.



[CPULimit](http://cpulimit.sourceforge.net/), Отправляет`SIGSTOP` а также`SIGCONT` по мере необходимости, чтобы поддерживать процесс ниже заданного процента использования процессора.

Даже до сих пор, WTF на "сумасшедшие жалобы и диковинные отзывы о вашей программе, убивающей производительность ПК », Я'Я бы с большей вероятностью пожаловался, что ваше программное обеспечение работает медленно и не использует мое оборудование наилучшим образом, но яЯ не твой клиент.

Редактировать: в Windows,`SuspendThread()` а также`ResumeThread()` вероятно, может произвести подобное поведение.



Это то, к чему вы должны стремиться, а не пытаться избежать. Эти математические вычисления важны, нет? Если только ты не'Попытка избежать захвата какого-либо другого ресурса, который явно не управляется ОС (мьютекс, диск и т. д.) и используется основным потоком, обычно попытка замедлить ваш поток - плохая идея. А как насчет многоядерных систем (которые будут почти во всех системах в будущем)? Вы'Я буду тормозить поток без всякой причины.

В ОС есть понятие кванта потока. Он позаботится о том, чтобы ни одна важная нить в вашей системе не оставалась голодной. И, как я уже упоминал, в многоядерных системах работа одного потока на одном процессоре совершенно не влияет на производительность других потоков на других ядрах.

Я также вижу в другом комментарии, что этот поток также выполняет много операций дискового ввода-вывода - эти операции уже приведут к тому, что ваш поток завершит работу, пока он 's ждет результатов, поэтому сны ничего не сделают.

В общем, если выВызываете Sleep (x), что-то не так / лениво в вашем дизайне, и если x == 0, вы 'вновь открывайте себя для живых блокировок (поток, вызывающий Sleep (0), может фактически быть перенесен немедленно, что делает его noop).