sleep
методы практически никогда не выполняют описываемую вами «вращательную» механику - нет причин тратить столько времени на процессор, когда все, что ему действительно нужно, это установить таймер внутри ОС, а затем просто прекратить работупока не пробудится таймером.Если процесс, который уже заморожен из-за вызова sleep
, снова заморожен из-за того, что вы его приостановили, он просто дважды приостанавливается;«Будильник» перезванивает и освобождает свое приостановление, но приложение все еще приостановлено, потому что вы приостановили его.Если вы приостановите его до того, как sleep
истечет, ваш приостановить / отменить приостановку просто не будет иметь никакого эффекта.
Таким образом, для потока просто невозможно узнать или позаботиться о том, почему sleep
принялдругое время, чем ожидалось.Он просто не выполнял код, пока он был sleep
ing.Он прекратил выполнение кода, а затем через некоторое время снова начал выполнять код, и проверка настенных часов просто скажет, как долго они работали, а не то, что заставило их замерзнуть в течение этого времени.(Возможно, это был низкий приоритет, и ОС была очень занята, и потребовалось так много времени, чтобы запланировать ее запуск после завершения sleep
.)
Самое близкое, что вы можете сделать, - написать свою собственную.sleep
и используйте его только для целей отладки.(Вероятно, он должен вызывать системный метод сна, когда он не находится в режиме отладки, поэтому вам не нужно изменять код вне функции - используйте условную компиляцию через #ifdef DEBUG
/ #endif
.) То, что sleep
должно делать точночто вы предлагаете: считать тики до тех пор, пока «настенные часы» не скажут, что они достаточно долго ждали, а если между тиками неожиданно большой разрыв, продвиньте крайний срок дальше, потому что это время не «засчитывается».
Все это говорит:
Может быть, вы задали не тот вопрос здесь.Почему вы все равно пытаетесь профилировать sleep
и сделать его стабильным при ручной остановке программы?Точное профилирование обычно исчезает в любом случае, когда вы внешне замораживаете программу - оно отбрасывает почти все связанные с синхронизацией свойства программы, особенно в отношении поведения кэша памяти процессора.