Sleep () против sleep_for ()

Может ли кто-нибудь объяснить разницу в поведении между этими двумя способами остановки потока, а затем продолжить его?

Sleep(); //from Win32

std::this_thread::sleep_for();

Я замечаю в условия многопоточности не в системной совместимости.

2

Решение

Разница в том, что sleep_for() определяется стандартом C ++ 11 и Sleep() определяется Windows API. Если вы используете sleep_for()вполне вероятно, хотя и не уверен, что компилятор будет генерировать код, который вызывает Sleep() при компиляции для Windows. Однако, поскольку это стандартная функция C ++ 11, это означает, что любой компилятор (правильно), реализующий стандарт C ++ 11, будет иметь некоторый способ генерировать код для функциональности, описанной функция для любых платформ, которые он поддерживает.

Другое важное отличие состоит в том, что sleep_for() занимает std::chrono::duration в качестве параметра вместо целого числа в миллисекундах. Это позволяет вам легче и точнее указать время, в течение которого вы хотите, чтобы поток спал. Он также перемещает некоторую информацию о документации в систему типов.

Вы хотели знать последствия sleep_for() против Sleep() для многопоточности, и все, что я могу сказать, это то, что sleep_for() имеет значения, определенные в стандарте C ++ 11, и Sleep(), имеет последствия, определенные в Windows API. И если вы проверите ссылку, каждый говорит о его соответствующий тип резьбы. Так что, если вы используете потоки C ++ 11, используйте sleep_for(), Если вы используете потоки Win32 напрямую, используйте Sleep(), Sleep() не имеет никакого представления о потоках C ++ 11, и поэтому не имеет четко определенного поведения. Точно так же, sleep_for() не имеет понятия о потоках Windows API, и поэтому не имеет четко определенного поведения там. Документация для каждой функции определяет ее взаимодействие с соответствующими потоками. Не смешивайте стандарты.

3

Другие решения

В то время как вы вызываете метод сна, как показано ниже, он инструктирует O / S приостановить поток для этого конкретного временного интервала, предоставленного в качестве параметра функции / методу sleep (). Как только эта функция выполнит O / S, временно остановите этот поток и установите сонное настроение. Делая это, O / S также освобождает микропроцессор от него (из спящего потока), чтобы процессор мог быть назначен другому потоку или процессу, ожидающему время процессора. Там нет никакой большой разницы между ними. Sleep() для Windows, и вы должны добавить заголовочный файл Windows <windows> и следующий, вы можете использовать как в Windows, так и в среде Unix и должны использовать заголовочный файл <chrono>,

 Sleep(); //from Win32
std::this_thread::sleep_for();

Вы можете использовать обе функции сна, как показано ниже:

 Sleep(100); //sleep for 100 m/s but only in windows
std::this_thread::sleep_for(std::chrono::milliseconds(100));//sleep for 100 m/s. Can be use in both windows and Unix environment

Через 100 м / с O / S разбудит спящий поток и переназначит ему процессор для дальнейшего выполнения и работы.

0

По вопросам рекламы [email protected]