Может ли кто-нибудь объяснить разницу в поведении между этими двумя способами остановки потока, а затем продолжить его?
Sleep(); //from Win32
std::this_thread::sleep_for();
Я замечаю в условия многопоточности не в системной совместимости.
Разница в том, что 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, и поэтому не имеет четко определенного поведения там. Документация для каждой функции определяет ее взаимодействие с соответствующими потоками. Не смешивайте стандарты.
В то время как вы вызываете метод сна, как показано ниже, он инструктирует 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 разбудит спящий поток и переназначит ему процессор для дальнейшего выполнения и работы.