Должен ли я CloseHandle() в дескрипторе потока?

_beginthreadex возвращает дескриптор потока:

m_hStreamStatsThread = (HANDLE) _beginthreadex( NULL, 0, StreamStatsThread, this, 0, NULL );

Этот дескриптор можно использовать, если вам нужно сослаться на поток в таких вызовах, как, например, TerminateThread(..).

Согласно странице MSDN на _beginthreadex, _beginthreadex не будет всегда возвращайте действительный дескриптор - например он также может возвращать -1L при ошибке и т. д.

Когда поток завершился нормально, должен ли я вызывать CloseHandle для дескриптора потока, или я могу просто установить его значение в NULL/INVALID_HANDLE_VALUE?


person Community    schedule 18.10.2010    source источник


Ответы (2)


Согласен с Неманей Трифуновичем.

Даже после выхода из потока его дескриптор действителен. Например, вы можете запросить возвращаемое значение.

Общее правило: каждый дескриптор Win32 должен быть закрыт CloseHandle, если не указано иное.

person valdo    schedule 18.10.2010
comment
Любой дескриптор ядра Win32 (т. е. все, что имеет тип HANDLE). Для тех, кто работает с WinAPI, это очевидно, но я видел людей, пытающихся закрыть дескрипторы окон/ресурсов (HWND, HICON, ...) с помощью CloseHandle. :) - person Matteo Italia; 18.10.2010
comment
Да, ты прав. Дело в том, чтобы закрыть дескрипторы ядра. Эти HWND, HICON, HCURSOR и т. д. являются пользовательскими дескрипторами. - person valdo; 19.10.2010
comment
P.S. Пользовательские дескрипторы — я имел в виду — дескрипторы, поддерживаемые user32. - person valdo; 19.10.2010

Пример кода на странице MSDN, на которую вы разместили ссылку, включает вызов CloseHandle(). Установка значения дескриптора в NULL не уменьшает количество внутренних ссылок объекта ядра и в любом случае практически бесполезна.

person Nemanja Trifunovic    schedule 18.10.2010