При каких сценариях запуск многопоточного приложения на одном ядре может снизить производительность?
Как насчет настройки соответствия многопоточного приложения только одному ядру?
В обоих случаях ответ практически одинаков.Если ваша программа работает на одном ядре, то одновременно работает только один поток.А это значит, что каждый раз, когда одному потоку приходится ждать другого, вам нужна ОС для переключения контекста, что является довольно дорогой операцией.
При запуске на нескольких ядрах есть большая вероятность того, что два потока, которые должны взаимодействовать, будут работать одновременно, и поэтому ОС не потребуется выполнять переключение контекста для продолжения вашего кода.
Так что на самом деле код, который требует много синхронизации между потоками, будет работать медленнее на одном ядре.
Но вы можете сделать его еще хуже.Спин-блокировка или любой другой цикл ожидания занятости абсолютно разрушит производительность.И должно быть понятно почему.Вы можете запускать только один поток за раз, поэтому, если вам нужен поток для ожидания какого-либо события, вы должны указать операционной системе немедленно перевести его в спящий режим, чтобы можно было запустить другой поток.
Если вместо этого выпросто сделайте некоторое «пока условие не выполнено, продолжайте цикл» занятый цикл, вы сохраняете поток работающим, даже если он не имеет ничего общего.Он будет продолжать цикл * до тех пор, пока ОС не решит, что время истекло, и не запланирует другой поток.(И если поток не блокируется чем-то, ему обычно разрешается запускаться более 10 миллисекунд за раз.)
В многопоточном программировании в целом и * особенно многопоточный код, работающий на одном ядре, вам нужно хорошо играть, и не перегружать ядро процессора больше, чем необходимо.Если вам нечего делать, разрешите запустить другой поток.
И угадайте, что делает ваш код.
Как вы думаете, какой эффект от этих строк?
if (!(al_get_timer_count(timer) > prevCount))
continue;
ЗАПУСТИТЬ ПЕТЛЯ!Я ГОТОВ БЫТЬ ЕЩЕ?НЕТ?Затем снова бегите по петле.Готов ли я бежать сейчас?ВСЕ ЕЩЕ НЕТ?ЗАПУСТИТЕ ЦИКЛ ВНОВЬ ..... ..... 1026 *
Другими словами: «У меня сейчас ЦП, и я НИКОГДА НЕ УБУДУ!! "
Если вам нечем заняться , используйте процессор для , а затем откажитесь от него , особенно , если у вас есть другой поток, готовый к работе.
Используйте мьютекс или какой-либо другой примитив синхронизации, или, если вы в порядке с более приблизительным периодом сна, основанным на времени, позвоните Sleep()
.
Но не надо, если вы хотите любой приличный уровень производительности, неограниченно загружайте процессор, если вы ожидаете, что другой поток выполнит некоторую обработку.