Как C ++ позволяет ждать без чрезмерной загрузки процессора - PullRequest
2 голосов
/ 15 июня 2019

Например, у меня есть код

while (!something} {
    //waiting
}

, он ждет что-то , но использует много ЦП.В C ++ есть такие вещи, как объединение потоков, ожидание переменной условия, блокировка мьютекса - которые позволяют ожидать, поэтому он проверяет некоторые условия, но ведет себя как неактивный процесс - не отнимает процессорное время.Как это сделать и есть ли способ заставить пока цикл (или любой другой код) вести себя так?

Ответы [ 2 ]

1 голос
/ 15 июня 2019

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

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

Фактически, это именно то, чем являются стандартные функции, такие как std::condition_variable::wait: абстракция над системным интерфейсом, которая в этом случае блокирует поток.std::cin::operator>> является еще одним примером вызова функции, которая блокирует выполнение потока.

1 голос
/ 15 июня 2019

Эти функции обязательно поддерживаются операционной системой.

ОС отвечает за распределение времени между вашими процессами и потоками, и вам необходимо, чтобы эти функции контролировали (или, скорее, запрашивали) этот механизм.

Ваша реализация стандартной библиотеки C ++ вызывает специфичные для платформы функции, предоставляемые вашей операционной системой.

Невозможно воспроизвести это самостоятельно, не используя типы / функции C ++, которые вы уже использовали.в списке: мьютексы и таймеры (или без вызова этих функций ОС самостоятельно, как мы делали в старые времена!).Все, что вы можете сделать, это спин-блокировка , подобная той, которую вы уже продемонстрировали.

...