Должен ли я закрыть () на дескриптор потока? - PullRequest
5 голосов
/ 18 октября 2010

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

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 18 октября 2010

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

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

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

3 голосов
/ 18 октября 2010

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

...