2016-03-01 4 views
1

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

Я ожидал, что выход будет что-то вдоль линий:

Start
Обратный звонок работает
Обратный звонок работает
Обратный звонок работает
WaitForSingleObject зацикливание
обратный вызов работает
Обратный звонок работает
WaitForSingleObject петля
Callba ск работает
Обратный звонок работает
WaitForSingleObject зацикливание
обратный вызов работает
Обратный звонок работает
... повторение в 10000 раз
End
конец резьбы

Но выход есть:

Начало
Обратный звонок работает
Обратный звонок работает
Обратный звонок работает
Обратный звонок работает
Обратный звонок работает
... повторение в 10000 раз
Обратный звонок работает
End
WaitForSingleObject зацикливание
конец нити

I думал, что ожидание в WaitForSingleObject будет тайм-аут в какой-то момент и int errupt поток в какой-то момент? Но поток кажется блокирующим, а не асинхронным?

DWORD WINAPI callback(LPVOID param) 
{ 
    printf("Start\n"); 

    for (int i=10000; i>0; i--) 
     printf("Callback running\n"); 

    printf("End\n"); 
    return 1; 
} 

int main() 
{ 
    HANDLE hThread = CreateThread(NULL, 0, callback, 0, CREATE_SUSPENDED, 0); 

    if (!hThread) { 
     printf("Failed to create thread\n"); 
     return 0; 
    } 

    ResumeThread(hThread); 
    while (WaitForSingleObject(hThread, 1) == WAIT_TIMEOUT) { 
     printf("WaitForSingleObject looping\n"); 
    } 

    CloseHandle(hThread); 
    printf("Thread end\n"); 

    system("PAUSE"); 
    return 0; 
} 
+2

Ваша нить не выполняет какие-либо уступчивые операции, которые отказываются от процессорного времени, пока поток не завершится. Попробуйте периодически называть цикл цикла 'Sleep()' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '\ –

+0

Вы также можете увеличить число оборотов внутри потока. Компьютеры бывают быстрыми, и только 10k выходов могут занимать меньше времени, характерного для типичного потока. Ищите в Интернете, что такое таймлис, он варьируется в семействе ОС MS Windows.Кроме того, 'WaitForSingleObject()', 'Sleep()' и другие функции, подобные тем, обычно будут спать для * в * * наименее * заданного времени! Нет никакой гарантии, что он будет спать где-то около 1 мс в вашем случае. Это связано с временным листом другого потока, а также с другими потоками других процессов! –

ответ

2

Параметр dwMilliseconds в WaitForSingleObject не может полагаться для точного времени. Единственный контракт заключается в том, что после того, как прошло много времени, поток будет в конечном итоге проснуться и вернуть значение TIMEOUT. Поток может не проснуться до следующего запланированного кванта, который может достигать 60 миллисекунд (или даже выше на Windows Server). Это более чем достаточно времени для завершения второго потока. Попытайтесь увеличить счетчик итераций таким образом, чтобы рабочий поток занимал не менее одной секунды для запуска - это должно быть достаточно времени для планирования первичного потока и запускать как минимум еще одну итерацию цикла TIMEOUT.

Смежные вопросы