Windows для профессионалов


Что происходит при завершении потока


А происходит вот что.

  • Освобождаются все описатели User-объектов, принадлежавших потоку. В Windows большинство объектов принадлежит процессу, содержащему поток, из которого они были созданы. Сам поток владеет только двумя User-объектами, окнами и ловушками (hooks). Когда поток, создавший такие объекты, завершается, система уничтожает их автоматически. Прочие объекты разрушаются, только когда завершается владевший ими процесс.
  • Код завершения потока меняется со STILL_ACTIVE на код, переданный в функцию ExitThread или TerminateTbread.
  • Объект ядра "поток" переводится в свободное состояние.
  • Если данный поток является последним активным потоком в процессе, завершается и сам процесс.
  • Счетчик пользователей объекта ядра "поток" уменьшается на 1.
  • При завершении потока сопоставленный с ним объект ядра "поток" не освобождается до тех пор, пока не будут закрыты все внешние ссылки на этот объект.

    Когда поток завершился, толку от его описателя другим потокам в системе в об щем немного. Единственное, что они могут сделать, — вызвать функцию GetExitCodeThread, проверить, завершен ли поток, идентифицируемый описателем hThread, и, если да, определить его код завершения.

    BOOL GetExitCodeThread( HANDLE hThread, PDWORD pdwExitCode);

    Код завершения возвращается в переменной типа DWORD, на которую указывает pdwExitCode. Если поток не завершен на момент вызова GetExitCodeThread, функция записывает в эту переменную идентификатор STILL_ACTIVE (0x103). При успешном вызове функция возвращает TRUE. К использованию описателя для определения фак та завершения потока мы еще вернемся в главе 9.



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