2012-05-13 5 views
5

Sto lavorando su un progetto in cui ho un thread principale e filo un demone per eseguire le uscite di file. Nel mio thread principale Ho un campo pthread_t * _daemon che vorrei cancellare, ma ovviamente solo dopo _daemon restituisce NULL (ho capito che l'utilizzo di pthread_exit() perdite di memoria causa).Eliminazione di un thread demone solo dopo ritorna

Come posso farlo senza occupato-attendere? Se cerco di usare una variabile di condizione Ho un problema - Quando chiamo signal() forma _daemon svegliare mio thread principale, cancella _daemon prima di esso _daemon restituisce null.

Quello che ho fatto è solo usare un blocco mutex che viene bloccato quando il programma viene avviato e sbloccato prima dei ritorni _daemon. C'è un modo migliore che non causi l'attesa?

+1

'pthread_join'? – Mat

+0

Non è chiaro cosa stai chiedendo. Che cosa ti piacerebbe cancellare esattamente? –

+0

Il campo pthread_t, ma solo dopo che il thread del daemon memorizzato lì restituisce – yotamoo

risposta

5

pthread_detach() fa quello che stai cercando. Sembra che risolverà il tuo problema (senza perdite) con molta meno complessità!

Così puoi tranquillamente chiamare pthread_detatch(_daemon) quando hai finito con l'altro thread, senza doversi preoccupare se il thread stesso è ancora in esecuzione. Fa non termina il thread, invece fa sì che il thread venga ripulito quando termina.

Dalla documentazione:

La funzione pthread_detach() indica all'attuazione che lo stoccaggio per il filo filo può essere recuperata quando quel filo termina. Se il thread non è stato terminato, pthread_detach() non deve terminare .

effetti è possibile creare un thread nello stato distaccato per cominciare modificando attr di:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
         void *(*start_routine) (void *), void *arg); 

opportunamente in creazione tempo. Il pthread_create() man dice:

Quando un thread indipendente termina, le sue risorse vengono rilasciati automaticamente alla sistema. [snip] Rendere indipendente un thread è utile per alcuni tipi di daemon thread il cui stato di uscita di cui l'applicazione non ha bisogno di preoccuparsi. Per default, , viene creato un nuovo thread in uno stato joinable, a meno che attr sia stato impostato su crea il thread in uno stato disconnesso (utilizzando pthread_attr_setdetachstate (3)).

+0

Ma _deamon che voglio liberare è nel thread principale, non nel thread daemon. Voglio cancellare questo campo solo dopo che il thread del daemon termina – yotamoo

+2

@yotamoo: Un oggetto 'pthread_t' può essere cancellato prima che il thread ad esso associato ritorni o sia altrimenti fatto. Il thread stesso non si basa sull'oggetto 'pthread_t' - l'eliminazione dell'oggetto' pthread_t' non distrugge il thread associato. Ma potrebbe essere necessario chiamare 'pthread_detach()' per far sapere al sistema che può ripulire tutte le risorse del thread quando il thread ritorna o esce. –

+0

Cosa si intende esattamente con "cancella un oggetto pthread_t"? – alk

1

pthread_t è un unsigned long int, quindi non vedo proprio la necessità di fare un puntatore di pthread_t (è possibile anche utilizzare il suo indirizzo in pthread funzioni), ma se insistete, allora è possibile eliminarla dopo creando un pthread (ma non avrete modo di comunicare con esso, perché è un numero di thread creato - usato per unire, staccare funzioni, ecc.).

Problemi correlati