Программирование драйверов Windows

       

Потоки как объекты синхронизации


В качестве синхронизационного примитива может выступать и объект программного потока. Выполняющийся программный поток имеет несигнальное состояние. Состояние становится сигнальным в момент прекращения работы потока, что может сделать только сам поток "естественным" образом, то есть вызовом PsTerminateSystemThread. Другой программный поток, каким-либо способом получивший дескриптор нужного для синхронизации потока, может остановить свою работу вызовом KeWaitForSingleObject, как показано ниже.

PKTHREAD pThreadObject; // Предположим, поток уже работает, его дескриптор hThread. // Получаем указатель на его объект: NTSTATUS status = ObReferenceObjectByHandle( hThread, THREAD_ALL_ACCESS, NULL, KernelMode, (PVOID *)& pThreadObject, NULL); if( !NT_SUCCESS(status) ) { // Действия по обработке ошибки. Может быть поток уже завершен? }

// Ожидаем окончания потока hThread status = KeWaitForSingleObject( (PVOID) pThreadObject, Suspended, KernelMode, FALSE, (PLARGE_INTEGER)NULL); // Поток завершился. // Даем системе возможность удалить объект потока ObDereferenceObject(pThreadObject); . . .



Содержание раздела