2011-11-23 9 views
6

Non sono interessato all'utilizzo dell'handle restituito da _beginthreadex(). È sicuro chiamare immediatamente lo CloseHandle()?Posso chiamare CloseHandle() immediatamente dopo _beginthreadex() riuscito?

Credo che questo deve essere fatto per evitare perdite di memoria.

+1

È necessario chiudere l'handle per evitare perdite di risorse, ma eseguirlo immediatamente dopo l'avvio del thread non lascia alcuna possibilità di essere in grado di sincronizzare (attendere) il completamento del thread utilizzando l'handle. E sì, è sicuro. –

+0

C'è ancora un altro modo per sincronizzarsi con il thread anche se si chiude immediatamente l'handle restituito da _beginthreadex. Il thread stesso può accedere al suo id del thread tramite GetCurrentThreadId e passarlo al thread principale. Quindi è sempre possibile chiamare OpenThread (con autorizzazione SYNCHRONIZE) per ottenere un nuovo handle dall'ID di quel thread. –

risposta

9

Sì, è possibile chiudere la maniglia non appena si decide di non aver più bisogno di quella maniglia. Ciò non influirà sull'esecuzione del thread. Comunque probabilmente dovresti controllare se il thread è stato avviato prima di procedere.

Le perdite che ti preoccupano non sono le perdite memoria, sono perdite di risorse di sistema, in genere sono molto peggio.

+0

Grazie. Qual è il modo migliore per determinare se il thread appena creato è stato effettivamente avviato? – user1061590

+0

@ user1061590: Non c'è un modo "migliore", ma penso che dovresti controllare il valore restituito da '_beginthreadex()' per assicurarti che abbia avuto successo. – sharptooth

-1

Secondo MSDN, non si deve chiudere l'handle restituito da __beginThreadEx: _endthread chiude automaticamente la maniglia filo (mentre _endthreadex non) .Pertanto, quando si utilizza _beginthread e _endthread, non chiudere in modo esplicito l'handle di thread chiamando il API CloseHandle Win32. (vedere http://msdn.microsoft.com/en-us/library/kdzttdcb(ar-sa).aspx per i dettagli.)

+1

Questa parte parla di una funzione diversa. "quando si utilizza ** _ beginthread ** e _endthread, non chiudere esplicitamente l'handle del thread" vs. "l'handle restituito da ** _ beginthreadex ** deve essere chiuso dal chiamante di _beginthreadex". –

+0

Grazie per aver sottolineato che, aiuta^_ ^ – YoungLearner

Problemi correlati