2013-01-13 6 views
8

Sono un principiante nell'API di Windows e recentemente ho imparato che non dovrei usare CreateThread e TerminateThread. Sono passato a _beginthreadex, tuttavia non sono sicuro di come dovrei use _endthreadex?Dove uso _endthreadex - windows API

Per esempio, ecco un funzione di base stavo testando con:

// MyThreadFunction - outputs "#.) I Work" and ends 
unsigned int __stdcall MyThreadFunction(void * lpParam) 
{ 
    int i = (int)lpParam; 
    cout << i << ".) I work! " << endl; 
    _endthreadex(0); 
    return 0; 
} 

È il mio posizionamento di _endthreadex corretta? Ce l'ho prima del ritorno 0, che mi sembra strano? Ho letto nelle pagine di msdn su _endthreadex che viene chiamato automaticamente quando una funzione termina, ma dovresti chiamarla per una migliore pulizia della memoria, ed è per questo che ho provato a inserirla. Non sembra giusto, scusa se è così una brutta domanda. Voglio solo assicurarmi che stia facendo tutto al meglio delle mie capacità

+1

Niente di sbagliato nell'uso di CreateThread. A meno che non si stia ancora utilizzando l'MSVC antico. –

+0

@DavidHeffernan Il CRT collegato in modo statico aveva problemi di perdita di memoria se non si utilizzava _begin/_endthread. Hai un riferimento per questo cambiamento? –

risposta

9

In realtà non è necessario chiamare il numero _endthreadex(). Verrà richiamato automaticamente dopo che la funzione thread è tornata comunque.

2

Non è necessario chiamarlo, come già menzionato. Per quanto riguarda il codice, penso che l'ultimo return 0; non verrà nemmeno chiamato perché _endthreadex() non ritorna mai. Questo potrebbe anche far sì che i distruttori di oggetti locali non vengano chiamati (che è ciò che ritengo che MSDN volesse dire), quindi l'utilizzo di questa funzione potrebbe persino essere dannoso in C++. Considerare l'utilizzo di Boost.Thread, hanno un'eccezione dedicata specificamente alla terminazione di un thread, che dovrebbe fare la cosa giusta se si vuole terminare il thread da qualche parte nel mezzo.

3

La risposta è già fornita in versione breve e, se desideri saperne di più, il ritorno dalla tua funzione verrà effettivamente utilizzato come argomento nella chiamata _endthreadex. Ecco cosa sta facendo il runtime quando avvii una discussione. Il filo è infatti iniziato con un punto di partenza da qualche parte in CRT, in cui interno _callthreadstartex sta facendo:

_endthreadex(MyThreadFunction(...)); 

Cioè, non appena si torna, _endthreadex saranno immediatamente chiamato per voi e si uscirà dal thread.

Potete utilizzarlo esplicitamente? Sì, puoi farlo, e il tuo codice è anche buono perché non importa molto se lo chiami tu stesso o verrà chiamato per te, a condizione che non si verifichino perdite (come, in particolare, non ancora chiamati distruttori di variabili locali).

Dal momento che sarà comunque chiamato per te, e il ritorno dalla funzione è più sicuro in termini di liberazione delle risorse locali, non c'è alcun uso, vantaggio e senso di effettuare una chiamata esplicita.

MSDN fondamentalmente spiega esattamente lo stesso in Remarks section.

È possibile chiamare _endthread o _endthreadex in modo esplicito per interrompere un thread ; tuttavia, _endthread o _endthreadex viene chiamato automaticamente quando il thread ritorna dalla routine passata come parametro a _beginthread o _beginthreadex. La chiusura di un thread con una chiamata a endthread o _endthreadex aiuta a garantire il corretto recupero delle risorse allocate per il thread.