2010-10-18 12 views
5

_beginthreadex zwraca uchwyt do wątku:Czy muszę CloseHandle() na uchwyt wątku?

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

Uchwyt ten może być używany, jeśli trzeba odnieść się do gwintu w połączeniach jak TerminateThread (..) na przykład.

Zgodnie z the MSDN page on _beginthreadex _beginthreadex nie zawsze zwróci prawidłowy uchwyt - np. może również zwrócić -1L w przypadku błędu itp.

Kiedy wątek zakończy się normalnie, czy muszę wywoływać CloseHandle na uchwycie wątku, czy mogę ustawić jego wartość na NULL/INVALID_HANDLE_VALUE?

Odpowiedz

9

Zgadzam się z Nemanja Trifunovic.

Nawet po wyjściu wątku - jego uchwyt jest ważny. Możesz na przykład zapytać o jego wartość zwracaną.

Zgodnie z ogólną zasadą: każdy uchwyt systemu Win32 musi być zamknięty przez CloseHandle, chyba że określono inaczej.

+2

Dowolny uchwyt Win32 * jądra * (tj. Wszystko, co jest typu "UCHWYT"). Dla kogoś, kto pracuje z WinAPI jest oczywiste, ale widziałem ludzi próbujących zamknąć okna/uchwyty zasobów ('HWND',' HICON', ...) z 'CloseHandle'. :) –

+1

Tak, masz rację. Chodzi o zamknięcie uchwytów jądra. Te HWND, HICON, HCURSOR i inne są uchwytami użytkownika. – valdo

+1

P.S. Obsługiwane przez użytkownika - mam na myśli - uchwyty obsługiwane przez user32. – valdo

3

Przykładowy kod na stronie MSDN, dla której zamieściłeś link, zawierający połączenie z numerem CloseHandle(). Ustawienie wartości uchwytu na NULL nie zmniejsza wewnętrznej wartości ref. Obiektu jądra i jest prawie bezużyteczne.

Powiązane problemy