Сообщение от
_nic
Я правильно понимаю что поток из которого будет производится проверка "замерзнет" до окончания работы проверяемого потока?Чем тогда это отличается от синхронизации через мутекс?Мне нельзя замораживать этот поток

Смотрим прототип
Код:
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);
Я же написала, что если вы поставите второй параметр INFINITE, то да, управление WaitForSingleObject вернет только после завершения работы потока. Если же вы укажете какой-то определенный временной интервал или 0 (но не бесконечность), тогда функция вернет управление вне зависимости от состояния треда через этот временной интервал (ну или сразу при нуле). Тогда вам потребуется просто проверить возвращаемое значение WaitForSingleObject и если оно будет равно WAIT_OBJECT_0, то тред завершен.
И с мьютексами, семафорами, эвентами, хендлами процессов принцип тот же. Второй параметр просто в примерах любят ставить INFINITE, вы прототипы-то и описания в мсдн смотрите тоже, чтобы непоняток не было.
вот пример
Код:
VOID StartRoutine(VOID)
{
int i;
for(i = 0;i<10;i++)
{
printf("I am in thread: count %d\n",i);
Sleep(100);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwStatus,dwTid;
HANDLE hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)&StartRoutine,0,0,&dwTid);
do
{
dwStatus = WaitForSingleObject(hThread,0);
printf("Status = %X\n",dwStatus);
Sleep(100);
}while(dwStatus !=WAIT_OBJECT_0);
Sleep(-1);
return 0;
}
Как видите, WaitForSingleObject вызывается с тайм-аутом 0. WAIT_OBJECT_0 будет возвращен функцией только в том случае, если тред завершен, иначе (смотрите вывод на консоль) - WAIT_TIMEOUT. И, конечно же, заморозки проверяющего треда нет. Вот такие дела.