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

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

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

while(true)
{
    //do math here
    callback(percent_complete);
}

В обратном вызове клиент называет Сон (x) для замедления потока.

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

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

Причина, которую я спрашиваю, состоит в том, что машина все еще в большой степени срывается даже при том, что taskman показывает процесс, поднимающий ~10% ЦП. Я уже исследовал жесткий диск и нехватку памяти напрасно, поэтому теперь я задаюсь вопросом, вызывает ли способ, которым я замедляю поток, эту проблему.

Спасибо!

8
задан Mahmoud Al-Qudsi 17 January 2010 в 15:25
поделиться

5 ответов

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

Единственное программное обеспечение, в котором я использую функцию, подобную этим, является клиент BOINC . Я не знаю, какой механизм он использует, но это открытый источник и многоплатформа, поэтому помогите себе.

У него есть параметр конфигурации («ограничение процессора, используемое на X%»). То, как я ожидаю внедрить, что для использования зависимых от платформы API, таких как так, как часы () или getSystemtime () , и сравните время процессора против прошедшего времени настенного времени. Сделайте немного реальной работы, проверьте ли вы или под пар, и если вы сначала спать на некоторое время, чтобы вернуться под.

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

2
ответ дан 5 December 2019 в 05:45
поделиться

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

23
ответ дан 5 December 2019 в 05:45
поделиться

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

0
ответ дан 5 December 2019 в 05:45
поделиться

посмотреть на Cpulimit . Он отправляет Sigstop и SIGCONT по мере необходимости, чтобы сохранить процесс ниже заданного процента использования процессора.

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

Отредактируйте: на Windows, SUSPENDTHREAD () и RESOMETHREAD () , вероятно, может вызвать аналогичное поведение.

0
ответ дан 5 December 2019 в 05:45
поделиться

Что не так с процессором на 100%? Это то, к чему нужно стремиться, а не пытаться избежать. Эти математические вычисления важны, не так ли? Если только вы не пытаетесь избежать затягивания какого-то другого ресурса, не управляемого явно операционной системой (мьютекс, диск и т.д.) и используемого главным потоком, то, как правило, пытаться замедлить ваш поток - плохая идея. А как насчет многоядерных систем (которые почти все системы будут, вперёд)? Вы будете замедлять поток без всякой причины.

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

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

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

4
ответ дан 5 December 2019 в 05:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: