Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_OS_chast_2.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
1.55 Mб
Скачать

Завершение потоков.

Любой поток может быть завершен одним из следующих 4 способов:

  1. естественный. Функция потока выполняется до конца, и возвращает управление в ОС;

  2. поток самоуничтожается путем вызова в нем ExitThread ();

  3. любой другой поток данного или иного процесса вызывает функцию уничтожения потока TerminateThread ();

  4. завершение процесса, содержащего данный поток.

Наиболее корректным для системы является первый способ. В этом случае, выполняются следующие системные действия:

  1. все объекты, созданные в программе потока, уничтожаются соответствующими деструкторами;

  2. система корректно освобождает память, которую занимал стек потока;

  3. система устанавливает код завершения данного потока, который возвращается из прикладной функции потока (из программы потока);

  4. счетчик числа пользователей объекта ядра «поток» уменьшается на единицу.

Во втором способе, вызывается в потоке и принудительно исполняется функция ExitThread (). При этом, освобождаются все системные ресурсы, выделенные потоку, в частности, стек. Но все объектные ресурсы, созданные в программе потока, не уничтожаются. В функцию ExitThread передается значение, которое рассматривается системой, как код завершения всего потока.

В третьем способе, в любом другом потоке процесса выполняется функция TerminateThread. Она имеет два параметра. В первом параметре задается дескриптор завершаемого потока, а второй параметр интерпретируется как код завершения для уничтожаемого потока. Особенность исполнения этой функции состоит в том, что её вызов оказывается внезапным для потока, и в следствие этого, в потоке не могут быть выполнены все действия для корректного освобождения системных и объектных ресурсов.

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

Четвертый способ. Поток завершается в результате окончания всего процесса. В этом случае, выполняется функция ExitProcess () или TerminateProcess (). В результате, выполняется освобождение выделенных для процесса ресурсов, в том числе и освобождение стеков всех потоков. Однако, при этом деструкторы созданных объектов не вызываются, и промежуточные данные не переписываются на диск для сохранения, и следовательно, завершение потока выполняется некорректно.

В любом из четырех рассмотренных случаев, в системе дополнительно реализуются дополнительные операции:

  1. освобождаются все дескрипторы интерфейсных объектов, которые принадлежали потоку, то есть окна, меню, значки, шрифты, курсоры, и т.д.;

  2. код завершения потока меняется с исходного значения 0x103 на действительное, которое вырабатывается в системе;

  3. объект ядра «поток» из состояния «занято» переводится в состояние «свободно», но при этом, объект полностью не освобождается до тех пор, пока на него не будут закрыты все внешние ссылки;

  4. счетчик числа пользователей объекта ядра «поток» уменьшается на единицу;

  5. если данный поток был самым последним активным потоком процесса, то завершается и сам процесс.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]