2014-12-09 9 views
7

Sto cercando di capire cosa esattamente un punto di cancellazione è in C++. Ho letto:Che cos'è esattamente un punto di cancellazione?

man page e What are pthread cancellation points used for

ma sono ancora un po 'confuso su alcuni punti. Ad esempio, sto usando la funzione file write(). Apparentemente questo è un punto di cancellazione. Quindi quando chiamo write(), posso vedere che un altro thread può iniziare l'elaborazione (quindi il mio codice passa dal thread di scrittura a un altro thread), questo di solito accade quando il buffer di scrittura è pieno e deve essere svuotato prima della scrittura() può avere successo/completare.

Ma nella mia mente, questa non è una cancellazione di un filo, ma solo un blocco temporaneo/sospendere, e non c'è discussione "pulizia" da fare ...

Quindi la mia domanda è, fare la cancellazione i punti hanno relazione con i "punti di blocco"? - sono davvero la stessa cosa o c'è qualche differenza? Qualsiasi chiara descrizione "top-level" di cosa sia un punto di cancellazione sarebbe davvero utile.

+1

Un punto di cancellazione, in generale, è un qualsiasi punto nel flusso di controllo in cui il controllo ritorna al programma di pianificazione. L'unico significato possibile di "cancellazione" è di non essere programmato di nuovo, quindi puoi cancellare qualcosa solo se puoi influenzare le decisioni di pianificazione. Le chiamate di sistema formano un'interazione naturale con lo scheduler, sebbene possano essercene altre. –

+0

@KerrekSB Con questo commento e la risposta di Bogdan V, penso che questo abbia davvero senso per me ora, grazie :) –

+0

Grazie a @KerrekSB per una spiegazione chiara, concisa e solida che menziona lo scheduler. – ifelsemonkey

risposta

8

Quando il filo viene tirato dall'esecuzione, il suo stato viene salvato dal sistema operativo e che non è una cancellazione del filo.La cancellazione significa terminazione del thread, su richiesta, con l'intento specifico di lasciare tutto in uno stato finale al termine (ovvero tutte le risorse vengono liberate, tutti i gestori vengono aggiornati, ecc.).

Ciò che si chiama il blocco può accadere a un thread mentre è in annullamento intermedio.

Esempio: il thread riceve una richiesta di cancellazione. Il sistema operativo lo mette in coda finché il thread non diventa cancellabile. Quando il thread diventa cancellabile e il thread sta eseguendo un punto di annullamento, il thread può essere pulito e cancellato. La funzione write è un punto di annullamento, questo significa che è sicuro dal punto di vista del sistema operativo annullare il thread mentre questa funzione viene eseguita (lo stato di tutte le risorse correlate sarà coerente).

Mentre la procedura di annullamento è in esecuzione, il thread può essere bloccato tutte le volte che il sistema operativo sembra in forma.

Come nota aggiuntiva, se si osserva il requisito POSIX per i punti di annullamento, è necessario che tutte le interfacce di blocco siano punti di annullamento. In caso contrario, su qualsiasi thread completamente bloccato (in tale chiamata), non ci sarebbe alcun modo sicuro per terminare quel thread.

http://man7.org/linux/man-pages/man7/pthreads.7.html

+0

Ah, questo ha più senso. Quindi, un punto di cancellazione serve davvero per cancellare i thread, ma c'è una relazione non diretta con i "punti di blocco" perché, come dici tu, altrimenti potresti ottenere thread "a deadlock" che non puoi nemmeno uccidere ... Penso questo risponde alla mia domanda e chiarisce la mia confusione :) –

+3

Il thread deadlock tecnicamente potrebbe essere ucciso con pthread_kill. Il thread di destinazione otterrà un SIGKILL. Ad esempio, i distruttori di oggetti nella memoria locale del thread non verranno chiamati. Inoltre, una volta ucciso, non vi è alcuna garanzia che le strutture interne utilizzate per il thread vengano liberate. pthread_cancel è pensato per essere il modo "più pulito" per farlo quando non si fa un join. –

+0

Sì, buon punto, grazie –

5

Quando si desidera terminare o annullare un filo da un altro thread (ad esempio, il filo principale) utilizzando pthread_cancel() avviene quanto segue (c.f.):

La funzione pthread_cancel() invia una richiesta di cancellazione al filo filo .

Il thread di destinazione non terminerà alla volta, ma quando raggiunge un punto cancellazione (c.f.):

POSIX.1 specifica che certe funzioni devono, ed alcuni altri funzioni possono , essere punti di cancellazione. Se un thread è cancellabile, il suo tipo di annullabilità viene rinviato e una richiesta di annullamento è in sospeso per il thread, quindi il thread viene annullato quando chiama una funzione che è un punto di annullamento.

Se queste funzioni che sono un punto di annullamento possono anche bloccare l'esecuzione della filettatura, non sono rilevanti a questo punto. C'è un elenco di queste funzioni nella documentazione:

Nota che ci sono impostazioni che possono influenzare il comportamento e "cancellability" di un filo che ho lasciato qui per semplicità. Per ulteriori approfondimenti:

+0

Grazie per tutti i link, ho letto la maggior parte di questi, penso che la fonte della mia confusione sia perché pensavo che un punto di "blocco" fosse lo stesso di un punto di cancellazione che le altre risposte mi avevano chiarito. Ancora, +1 per tutte le informazioni :) –