C++ - как действительно Спит () и работа cin?

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

необходимо добавить некоторые начальные пустые проверки и затем просто снова использовать его как будто это где в BCL.

17
задан quano 21 April 2010 в 21:32
поделиться

6 ответов

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

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

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

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

что касается sleep () , любой процесс может уведомить ОС, которую хотелось бы подождать. Затем планировщик будет активирован еще до аппаратного прерывания (что также происходит, когда процесс пытается выполнить блокирующее чтение из потока, у которого нет данных, готовых для чтения), и ОС отмечает, что это за процесс. ожидать. Для сна процесс ожидает срабатывания будильника или может просто снова срабатывать при каждом перезапуске, пока не истечет таймер.

Поскольку ОС возобновляет процессы только после того, как что-то заставляет ее прерывать выполнение запущенного процесса, например, процесс уступки или прерывание аппаратного таймера, о котором я упоминал, sleep () не очень точен, точность зависит от ОС или оборудования, но обычно это порядка одной или нескольких миллисекунд.

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

29
ответ дан 30 November 2019 в 12:01
поделиться

Операционная система планирует, как выполняются процессы (какие процессы могут запускаться, в каком порядке,. ..). Sleep () , вероятно, выдает системный вызов, который сообщает ядру: «Не позволяйте мне использовать процессор в течение x миллисекунд».

3
ответ дан 30 November 2019 в 12:01
поделиться

Если вы ищете более контролируемый способ блокировки потока / процесса в многопоточной программе, обратите внимание на Семафоры, Мьютексы, Критические разделы и События. Это все методы, используемые для блокировки процесса или потока (без загрузки ЦП через конструкцию while).

По сути, они работают на идиоме ожидания / сигнала, когда заблокированный поток ожидает, а другой процесс сигнализирует ему, чтобы он начал снова. Они (по крайней мере, в окнах) также могут иметь тайм-ауты, обеспечивая тем самым функциональность, аналогичную Sleep ().

0
ответ дан 30 November 2019 в 12:01
поделиться

'cin' использует массу перегруженных операторов. Символ «>>», который обычно представляет собой сдвиг вправо, перегружен практически для всех типов правых операндов в C ++. Для каждого предусмотрена отдельная функция, которая считывает данные с консоли и преобразует входные данные в переменные любого типа, который вы указали. Например:

std::cin::operator>> (int &rhs);

Это не настоящий C ++ - я давно не работал с потоками и перегрузками, поэтому не помню тип возвращаемого значения или точный порядок аргументов. Тем не менее, эта функция вызывается, когда вы запускаете cin >> целочисленную переменную.

Точная базовая реализация зависит от операционной системы.

1
ответ дан 30 November 2019 в 12:01
поделиться

Короче говоря, Sleep () указывает ОС на некоторое время игнорировать процесс / поток.

2
ответ дан 30 November 2019 в 12:01
поделиться

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

0
ответ дан 30 November 2019 в 12:01
поделиться
Другие вопросы по тегам:

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