2010-10-18 7 views
5

_beginthreadex retourne une poignée à un fil:Dois-je CloseHandle() sur une poignée de thread?

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

Cette poignée peut être utilisé si vous avez besoin de se référer au fil des appels comme TerminateThread (..) par exemple.

Selon the MSDN page on _beginthreadex, _beginthreadex ne renverra pas toujours un handle valide, par ex. il peut également renvoyer -1L sur erreur, etc.

Lorsqu'un thread s'est terminé normalement, dois-je appeler CloseHandle sur la poignée de thread, ou puis-je simplement définir sa valeur sur NULL/INVALID_HANDLE_VALUE?

Répondre

9

D'accord avec Nemanja Trifunovic.

Même après la fermeture du thread, son handle est valide. Vous pouvez par exemple interroger sa valeur de retour.

En règle générale: chaque handle Win32 doit être fermé par CloseHandle, sauf indication contraire.

+2

Toute poignée Win32 * kernel * (c'est-à-dire tout ce qui est de type 'HANDLE'). Pour quelqu'un qui travaille avec WinAPI est évident, mais j'ai vu des gens essayant de fermer les poignées de fenêtres/ressources ('HWND',' HICON', ...) avec 'CloseHandle'. :) –

+1

Oui, vous avez raison. Le but est de fermer les poignées du noyau. Ceux HWND, HICON, HCURSOR et etc. sont des poignées d'utilisateur. – valdo

+1

P.S. Les poignées de l'utilisateur - je voulais dire - les poignées supportées par user32. – valdo

3

L'exemple de code sur la page MSDN auquel vous avez envoyé un lien inclut un appel à CloseHandle(). La définition de la valeur du handle sur NULL ne réduit pas le nombre de références internes de l'objet noyau et est pratiquement inutile.