C ++ - как работает Sleep () и cin?

Просто любопытно. Как на самом деле работает функция Sleep () (объявленная в windows.h)? Может быть, не только эта реализация, но кто угодно. Имея это в виду - как это реализовано? Как он может заставить код "остановиться"? на определенное время? Также любопытно, как cin & gt; & gt; и те, на самом делеwork, Что они делают именно?

Единственный способ, которым я знаю, как «заблокировать» продолжение выполнения выполняется с помощью цикла while, но, учитывая, что это требует огромного количества вычислительной мощности по сравнению с тем, что происходит, когда вы вызываете методы для чтения из stdin (просто сравните while (true) с read от stdin), я предполагаю, что это не то, что они делают.

Ответы на вопрос(7)

& APOS; CIN & APOS; использует тонну перегруженных операторов. & gt;», который обычно является правым битовым сдвигом, перегружен практически для каждого типа правого операнда в C ++. Для каждого из них предусмотрена отдельная функция, которая считывает данные с консоли и преобразует ввод в любой тип переменной, который вы указали. Например:

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

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

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

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

Решение Вопроса

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

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

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

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

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

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

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

 03 июл. 2009 г., 23:10
Хороший ответ. +1

как выполняются процессы (какие процессы могут запускаться, в каком порядке, ...). Sleep() возможно, выдает системный вызов, который сообщает ядру «не позволяйте мне использовать процессор дляx миллисекунды & # x201D ;.

 quano04 июл. 2009 г., 12:54
Просто любопытно. Как вы делаете такие звонки самостоятельно? Если вы не можете на Windows из-за скрытой реализации, может быть, пример Linux?
 04 июл. 2009 г., 14:37
GNU / Linux соответствует системным вызовам Posix. Системные вызовы Posix определены как функции C, но, как правило, они являются только оболочкой для основного системного вызова. Если вы посмотрите на /usr/include/asm/unistd_32.h, вы увидите, что существует системный вызов для nanosleep (). Вполне вероятно, что sleep () реализуется путем вызова этого системного вызова. В Windows также есть системные вызовы, но они не документированы, поэтому практически нет причин выяснять, как они работают.

Sleep () сообщает операционной системе некоторое время игнорировать процесс / поток.

 15 дек. 2013 г., 20:31
Что если это многопоточный процесс?
 16 дек. 2013 г., 17:55
это повлияет только на текущий поток

называемую «планировщик». он отправляет инструкции из всех запущенных программ в ЦП, которые фактически их запускают. Системные вызовы, такие как «Sleep» и & quot; уснуть & quot; соответствовать инструкциям, которые сообщают планировщику IGNORE об этом потоке или процессе в течение фиксированного периода времени.

Что касается потоков C ++, то "cin" скрывает фактический дескриптор файла (stdin и stdout на самом деле являются такими дескрипторами), к которому вы обращаетесь, и & quot; & gt; & quot; Оператор для этого скрывает основные вызовы для чтения и записи. Поскольку это интерфейс, реализация может быть специфичной для ОС, но концептуально она все еще делает такие вещи, как printf и scanf.

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

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

 04 июл. 2009 г., 01:53
версии с тайм-аутом также доступны в системах POSIX.

Ваш ответ на вопрос