2012-01-23 1 views
5

Sono un po 'confuso sull'ordine di pulizia quando si utilizzano PThreads in relazione alla cancellazione. Normalmente, se il tuo thread è staccato, pulisce automaticamente quando termina. Se non è scollegato, è necessario unirsi a esso per recuperare le risorse di sistema.Devi partecipare a un thread annullato? (pthreads)

Il libro di testo che sto leggendo comunica quanto segue che suona strano come entrare è facoltativo per quanto riguarda la cancellazione:

"Se hai bisogno di sapere quando il thread è in realtà terminato, è necessario unirsi con esso chiamando pthread_join dopo averlo cancellato. "

Quindi, ho bisogno di unire una discussione cancellata per liberare le sue risorse - e se no, allora perché?

risposta

6

TLPI dice:

Alla ricezione di una richiesta di cancellazione, una filettatura cui cancelability è abilitato e differito termina quando raggiunge successiva cancellazione punto. Se il thread non è stato staccato, è necessario che un altro thread nel processo si unisca a esso per impedire a di diventare un thread di zombi.

Inoltre, dal momento che l'annullamento di un filo di solito non è fatto immediatamente (saperne di più "punti di cancellazione") senza entrare non si può essere sicuri che il filo è stato effettivamente annullato.

+0

Diventerebbe un thread di zombi se fosse stato impostato su modalità scollegata prima di essere annullato? o dovrei fare una nuova domanda: p –

+0

@ w00te Dipende da te. Ma la citazione dice "* se il thread non è stato rimosso *". Se si scollega un thread non è necessario (** e nessun modo **) unirsi a esso. Una volta scollegato un thread non è possibile renderlo nuovamente unificabile. – cnicutar

+0

Lo standard Posix non parla di thread zombi, ma se ho capito bene il termine, un thread che è stato staccato non diventerà mai uno zombi. (Logicamente, staccare un thread ha lo stesso effetto che dire al sistema di fare un join su di esso per te, non appena finisce.) –

3

Da man pthread_join:

Dopo un thread cancellato è terminato, un join con quel filo utilizzando pthread_join (3) ottiene PTHREAD_CANCELED come stato di uscita del thread. (Partecipare con un filo è l'unico modo per sapere che la cancellazione è completata.)

Sembra che l'adesione non è necessario per l'esecuzione, è necessario se si vuole sapere cosa hai fatto realmente successo.

1

Da Doccumentation di pthread_cancel():

Dopo un thread cancellato è terminato, un join con quel filo utilizzando pthread_join (3) ottiene PTHREAD_CANCELED come stato di uscita del thread. (L'unione con un thread è l'unico modo per sapere che la cancellazione è stata completata.)

+0

Lo capisco, ma la mia domanda è: se non mi interessa ricevere la conferma dell'annullamento, devo ancora chiamare pthread_join, o è una specie di caso speciale in cui le risorse sono già state liberato ed è opzionale (che è quello che sembra nella citazione che ho notato)? –

+0

@ w00te: non credo sia necessario in questo caso. –

+0

@Als Lo è. Stai confondendo cancellando con il distacco. Non è necessario unirsi a un thread separato --- infatti, è un errore farlo. A meno che il thread non sia stato staccato, tuttavia, è necessario eseguire un join o staccarlo. –

0

Se qualcosa va storto in un thread o viene interrotto da in, in qualche modo verrà sempre riordinato dal sistema operativo. Quindi è tutto bello e sicuro.

Devi solo unirti al thread se devi essere sicuro che ha effettivamente smesso di eseguire, come la fusione di due attività parallele. (Per esempio.se hai vari thread che lavorano su varie parti una struttura divisa devi unirli tutti, come in attesa finché non sono tutti finiti, quando vuoi combinare di nuovo la struttura)

+0

Questo è falso. A meno che un thread non sia stato staccato, il sistema deve tenerlo in giro fino a quando non viene unito, in modo che il join funzioni. Questo richiede risorse, il che significa che se lo fai sistematicamente, finirai per esaurire le risorse. –

1

Un thread che usa pthread può avere i seguenti stati di cancellazione :

 
PTHREAD_CANCEL_ENABLE 
PTHREAD_CANCEL_DISABLE 

Se si tenta di cancellare un filo non al 100% a sapere se il filo sarà davvero ottenere annullata. L'uso di un join ti fornisce le informazioni se il thread è stato davvero cancellato o meno. Ci sono anche annullare tipi da prendere in considerazione e le rispettive funzioni pthread per impostare il tipo e lo stato annullare:

 
int pthread_setcancelstate (int state, int *oldstate); 
int pthread_setcanceltype (int type, int *oldtype); 

Ecco un codice di esempio preso in prestito da http://www.ijon.de/comp/tutorials/threads/cancel.html

EDIT: o io sono troppo stupido per pubblicare un paio linee di codice o il formattatore mi stanno davvero facendo i nervi oggi. Basta cercare il codice nel link sopra, per favore.

+0

+1 per il campione :) –