Регулировка ЦП в C++

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

int *ary = new int[sizeX * sizeY];

Затем вы можете получить доступ к элементам как:

ary[y*sizeX + x]

Не забудьте использовать delete [] на ary.

43
задан Mark Harrison 11 May 2016 в 05:53
поделиться

4 ответа

Я не знаю ни о каком API, чтобы сделать, заставляют планировщик ОС делать то, что Вы хотите (даже если Ваш поток будет неактивным приоритетом, если не будет никакого более высокого приоритета готовые потоки, Ваш будет работать). Однако я думаю, что можно импровизировать довольно изящную функцию регулировки на основе того, что Вы уже делаете. По существу (у меня нет Windows dev машиной удобный):

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

  1. , Вычисляют сумму процессорного времени Ваш поток, используемый с прошлого раза, когда Ваша функция регулировки была вызвана (я назову этот dCPU). Можно использовать GetThreadTimes () API для получения количества времени, которое выполнял поток.
  2. Вычисляют сумму реального времени, истекшего с прошлого раза, когда Ваша функция регулировки была вызвана (я назову этот dClock).
  3. dCPU / dClock является использованием ЦП процента (одного ЦП). Если это выше, чем Вы хотите, увеличиваете свое время сна, если ниже, уменьшите время сна.
  4. Имеют Ваш сон потока в течение вычисленного времени.

В зависимости от того, как Ваш сторожевой таймер вычисляет использование ЦП, Вы могли бы хотеть использовать GetProcessAffinityMask () для обнаружения, сколько центральных процессоров система имеет. dCPU / (dClock * центральные процессоры) является процентом общего доступного процессорного времени.

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

20
ответ дан Matthew Xavier 26 November 2019 в 23:10
поделиться

На Linux можно изменить приоритет планирования потока с хорошим ().

4
ответ дан Mark Harrison 26 November 2019 в 23:10
поделиться

Проблема, не нормально хотеть оставить ЦП неактивным, в то время как Вы должны проделать работу. Обычно Вы поставили фоновую задачу, чтобы БЕЗДЕЙСТВОВАТЬ приоритет и позволить ОС обработать планирование всего этого процессорное время, которое не используется интерактивными задачами.

Это звучит мне как проблема, сторожевой процесс.

, Если Ваша фоновая задача является зависящей от ЦП тогда, Вы хотите, чтобы она заняла все неиспользованное процессорное время для своей задачи.

, Возможно, необходимо ли посмотреть на фиксацию сторожевой программы?

2
ответ дан Douglas Leeder 26 November 2019 в 23:10
поделиться

Я не могу думать ни о каком кросс-платформенном способе того, что Вы хотите (или любой гарантируемый путь точка), но поскольку Вы используете GetTickCount, возможно, Вы не интересуетесь кросс-платформенным:)

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

РЕДАКТИРОВАНИЕ: Я соглашаюсь с Bernard, который является, почему я думаю, процесс, а не поток мог бы быть более соответствующим, но это просто не могло бы удовлетворить Вашим целям.

2
ответ дан Community 26 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

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