Азбука программирования в Win32 API


Азбука программирования в Win32 API - стр. 194


Раз у потока есть начало, то должно быть и

ЗАВЕРШЕНИЕ ПОТОКА

Как и процесс, поток может быть завершен двумя способами - вызо­вом функции ExitThreadQ и обращением к функции TenninateThread(). Отличаются они друг от друга примерно тем же, что и функции ExitProcessQ и TerminateProcessQ. Первая функция, ExitThreadQ, исполь­зуется для нормального завершения потока. Естественно, что она вызы­вается изнутри потока. Она описана в файле winbase.h:

WINBASEAPI VOID WINAPI ExitThread(DWORD dwExitCode);

Единственным ее аргументом является двойное слово, в которое будет помещен код возврата этой функции.

Функцию TerminateProcess(), описанную в том же файле winbase.h следующим образом,

WINBASEAPI BOOL WINAPI TerminateThreadfHANDLE hThread,

DWORD dwExitCode);

следует вызывать только в крайних случаях, когда поток завис, и ни на какие действия пользователя не реагирует. Функция вызывается из какого-либо внешнего (по отношению к завершаемому) потока, а ее

233

аргументами являются хэндл завершаемого потока и двойное слово, в которое будет записан код завершения потока.

Осталось только узнать, что происходит при завершении потока. Во-первых, освобождаются или удаляются все занятые или созданные объекты. Это действие является стандартным и ничего особенного собой не представляет. Во-вторых, поток получает статус незанятого (signaled). В-третьих, код завершения процесса меняется со STILL ACTIVE на указанный при вызове завершающей поток функции. В-четвертых, уменьшается счетчик пользователей потока. Если пользователей потока больше не осталось, и поток является единственным потоком процесса, то завершается и процесс. Все легко, просто и логично.

СИНХРОНИЗАЦИЯ

К этому моменту читатель уже знает, что в программе один поток, главный, запускается автоматически при запуске. Следовательно, созда­вая новые потоки, мы тем самым делаем программу многопотоковой. Хорошо, конечно, если эти потоки работают независимо. А как быть тем потокам, которые зависят друг от друга? Например, осуществляют дос­туп к одному и тому же файлу или продолжение работы одного зависит от выполнения какого-то условия в другом? Для решения этих проблем в Win32 предусмотрен механизм синхронизации, который позволяет, что следует из его названия, синхронизировать работу потоков.




Начало  Назад  Вперед



Книжный магазин