Операционные системы. Учебное пособие. Марапулец Ю.В. - 67 стр.

UptoLike

Составители: 

Хотя функция CloseHandle не влияет на псевдодескрипторы, дескриптор, созданный с
помощью функции DuplicateHandle, является настоящим и в конце концов должен быть
закрыт. Применение псевдодескрипторов значительно ускоряет работу функции
GetCurrentThread, поскольку в этом случае подразумевается, что поток имеет полный
доступ сам к себе, и функция возвращает результат, не заботясь о мерах безопасности.
По аналогии с тем, как Windows-программа завершается по достижении конца
функции WinMain, поток обычно прекращает свое существование при достижении кон-
ца функции, в которой был начат. Когда он достигает конца стартовой функции, система
автоматически вызывает команду ExitThread, имеющую такой синтаксис:
VOID ExitThread( DWORD dwExitCode );
Хотя операционная система вызывает функцию ExitThread автоматически, при не-
обходимости досрочного завершения потока вы можете вызвать эту функцию явным об-
разом:
DWORD ThreadFunction( LPDWORD lpdwParam )
{
HANDLE hThread = CreateThread( <параметры>);
// далее следуют стандартные операции инициализации;
// проверка наличия ошибочных условий
if ( <условие возникновения ошибки> )
{
ExitThread( ERROR_CODE ); // прекратить работу потока
}
// ошибки нет, работа продолжается
return( SUCCESS_CODE ); // эта строка программы
// заставляет систему вызвать функцию ExitThread
}
Параметры ERROR_CODE и SUCCESS_CODE определяются по вашему усмотре-
нию. В нашем простом примере поток нетрудно прервать с помощью команды return:
if( <условие возникновения ошибки> )
{
return( ERROR_CODE ); // прекратить работу потока
}
В данном случае, команда return приводит к тому же результату, что и функция Ex-
itThread, так как при ее выполнении осуществляется неявный вызов последней. Эта
функция особенно полезна при необходимости прервать поток из любой под програм-
мы, вызываемой внутри функции типа ThreadFunction.
Когда поток завершается с помощью оператора return, 32-разрядный код заверше-
ния автоматически передается функции ExitThread. После прекращения работы потока
код его завершения может быть получен с помощью функции, приведенной ниже:
// один поток вызывает эту функцию для получения кода завершения другого потока
BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpdwExitCode );
Функция GetExitCodeThread возвращает значение FALSE в том случае, если опре-
делить код завершения помешала ошибка.
69
Хотя функция CloseHandle не влияет на псевдодескрипторы, дескриптор, созданный с
помощью функции DuplicateHandle, является настоящим и в конце концов должен быть
закрыт. Применение псевдодескрипторов значительно ускоряет работу функции
GetCurrentThread, поскольку в этом случае подразумевается, что поток имеет полный
доступ сам к себе, и функция возвращает результат, не заботясь о мерах безопасности.
     По аналогии с тем, как Windows-программа завершается по достижении конца
функции WinMain, поток обычно прекращает свое существование при достижении кон-
ца функции, в которой был начат. Когда он достигает конца стартовой функции, система
автоматически вызывает команду ExitThread, имеющую такой синтаксис:

VOID ExitThread( DWORD dwExitCode );

     Хотя операционная система вызывает функцию ExitThread автоматически, при не-
обходимости досрочного завершения потока вы можете вызвать эту функцию явным об-
разом:

DWORD ThreadFunction( LPDWORD lpdwParam )
{
    HANDLE hThread = CreateThread( <параметры>);
            // далее следуют стандартные операции инициализации;
            // проверка наличия ошибочных условий
    if ( <условие возникновения ошибки> )
    {
            ExitThread( ERROR_CODE ); // прекратить работу потока
    }
            // ошибки нет, работа продолжается
    return( SUCCESS_CODE );         // эта строка программы
    // заставляет систему вызвать функцию ExitThread
}

     Параметры ERROR_CODE и SUCCESS_CODE определяются по вашему усмотре-
нию. В нашем простом примере поток нетрудно прервать с помощью команды return:

      if( <условие возникновения ошибки> )
      {
             return( ERROR_CODE );    // прекратить работу потока
      }

      В данном случае, команда return приводит к тому же результату, что и функция Ex-
itThread, так как при ее выполнении осуществляется неявный вызов последней. Эта
функция особенно полезна при необходимости прервать поток из любой под програм-
мы, вызываемой внутри функции типа ThreadFunction.
      Когда поток завершается с помощью оператора return, 32-разрядный код заверше-
ния автоматически передается функции ExitThread. После прекращения работы потока
код его завершения может быть получен с помощью функции, приведенной ниже:

// один поток вызывает эту функцию для получения кода завершения другого потока
BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpdwExitCode );

     Функция GetExitCodeThread возвращает значение FALSE в том случае, если опре-
делить код завершения помешала ошибка.


                                         69