
02.03.2010, 20:34
|
|
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
С нами:
9023100
Репутация:
395
|
|
ога d_x Рихтер пишет
Завершение потока
Поток можно завершить четырьмя способами:
- функция потока возвращает управление (рекомендуемый способ);
- поток самоуничтожается вызовом функции ExitThread(нежелательный способ);
- один из потоков данного или стороннего процесса вызывает функцию TerminateThread (нежелательный способ);
- завершается процесс, содержащий данный поток (тоже нежелательно).
В этом разделе мы обсудим перечисленные способы завершения потока, а также рассмотрим, что на самом деле происходит в момент его окончания.
Возврат управления функцией потока
Функцию потока следует проектировать так, чтобы поток завершался только после того, как она возвращает управление. Это единственный способ, гарантирующий корректную очистку всех ресурсов, принадлежавших Вашему потоку. При этом:
- любые С++-объекты, созданные данным потоком, уничтожаются соответствующими деструкторами;
- система корректно освобождает память, которую занимал стек потока;
- система устанавливает код завершения данного потока (поддерживаемый объектом ядра "поток") — его и возвращает Ваша функция потока;
- счетчик пользователей данного объекта ядра "поток" уменьшается на 1.
Функция ExitThread
Поток можно завершить принудительно, вызвав:
VOID ExitThread(DWORD dwExitCode);
При этом освобождаются все ресурсы операционной системы, выделенные данному потоку, но C/C++ - ресурсы (например, объекты, созданные из С++-классов) не очищаются. Именно поэтому лучше возвращать управление из функции потока, чем самому вызывать функцию ExitThread...
|
|
|