Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Уж не знаю в каком рантайме ты нашел такой sleep. НО 04.02.05 17:26 Число просмотров: 2262
Автор: amirul <Serge> Статус: The Elderman
|
Исходники микрософтовского рантайма распространяются вместе с компилятором. Там функция sleep (определена в файле slbeep.c) выглядит следующим образом:
**void _sleep(duration) - Length of sleep
*
*Purpose:
*
*Entry:
* unsigned long duration - length of sleep in milliseconds or
* one of the following special values:
*
* _SLEEP_MINIMUM - Sends a yield message without any delay
* _SLEEP_FOREVER - Never return
*
*Exit:
* None
*
*Exceptions:
******************************************************************************
void __cdecl _sleep(unsigned long dwDuration)
{
if (dwDuration == 0) {
dwDuration++;
}
Sleep(dwDuration);
}
---
При этом Sleep() сводится к SleepEx(), SleepEx в конечном счете вызывает NtDelayExecution из ntdll.dll, который через гейт переходит в ntoskrnl.exe-овский NtDelayExecution, который в свою очередь вызывает KeDelayExecutionThread, а последний работает напрямую с очередью ожидания потока. На стеке выделяется таймер, инициализируется нужными значениями, вставляется в очередь ожидания потока и просто переключается контекст (KiSwapThread()) из этой функции винда возвращается уже ПОСЛЕ того, как потоку отдадут следующий квант. А следующий квант этому потоку дадут только тогда, когда сработает ожидаемый таймер.
|
|
|