Lo standard Posix ci offre la possibilità di sviluppare programmi multithread in lingua C. Questa tecnica di programmazione consiste nell'utilizzo della libreria "PThread" per aprire uno o più thread di sottoprocesso che funzionano in parallelo con il processo principale.
L'implementazione di thread offre grandi benefici al programma finale poiché accelera i tempi di esecuzione eseguendo più attività contemporaneamente, può essere strutturata meglio e fa un uso migliore delle risorse di sistema.
Un thread viene creato con la funzione pThread_ create (). Una volta chiamata questa funzione, il thread inizia in esecuzione in parallelo con il processo principale. Quando viene chiamata questa funzione, restituisce l'ID thread nel thread dell'argomento di output. Questo identificatore viene utilizzato per fare riferimento al thread creato quando si utilizza le funzioni di gestione del thread come pThread_join () o pThread_cancel ().
In questo articolo di Linux Sum.
Sintassi della funzione pThread_cancel () in lingua C
int pThread_cancel (thread pThread_t);Descrizione della funzione pThread_cancel () in lingua C
La funzione pThread_cancel () invia una richiesta al sistema per annullare il thread specificato dall'identificatore nel thread dell'argomento di input.
La chiamata alla funzione pThread_cancel () non implica la risoluzione immediata del thread, ma una richiesta per farlo. Se un thread viene terminato dopo aver chiamato questa funzione dipende dagli attributi assegnati quando viene creata. Se un thread viene creato con i suoi attributi predefiniti, può essere annullato.
Gli attributi Annulla di un thread possono essere recuperati con la funzione pThread_setcancelstate () e possono essere impostati con pThread_setcanceltype ().
Se la funzione pThread_cancel () ha esito positivo, restituisce 0 come risultato. Se fallisce, restituisce un valore diverso da zero.
La funzione pThread_cancel () dalla libreria PThread è definita nel "thread.H ”intestazione. Per utilizzare questo e le altre funzioni di gestione dei thread, è necessario includere questa intestazione nel programma come segue:
#includereI programmi che utilizzano le funzioni di gestione dei thread devono essere compilati chiamando la libreria thread dalla riga di comando Linux. Altrimenti, gli errori si verificheranno.
Di seguito è riportata una sezione speciale che spiega come compilare correttamente i programmi che utilizzano le funzioni dalla libreria thread.
Come annullare un thread in esecuzione usando la funzione pThread_cancel () in lingua C
In questo esempio, creiamo un thread con la funzione pThread_create () e quindi annullano nel mezzo dell'esecuzione con la funzione pThread_cancel ().
Per fare ciò, creiamo il thread "thread_1" che esegue la funzione th_function () che consiste in un ciclo per 10 cicli, ognuno dei quali stampica il "Secondi dal thread init e il numero di secondi trascorsi" frase nella console di comando. Successivamente, viene inserito un ritardo di 1 secondo per ripetere di nuovo il ciclo. Quindi, il tempo di esecuzione del thread è di circa 10 secondi.
Una volta creato ed in esecuzione, introduciamo un ritardo di 5 secondi tramite la funzione principale () e termiamo il sottoprocesso dopo la metà del tempo di esecuzione. Per terminare il thread, chiamiamo la funzione pThread_cancel () e passiamo l'identificatore thread_1 che viene restituito dalla funzione pThread_create () come argomento di input quando viene creato il thread. Ora, guardiamo il codice per questo esempio:
#includereLa seguente immagine mostra la compilazione e l'esecuzione del codice. Come puoi vedere, il thread viene terminato con la funzione pThread_cancel () al centro dell'esecuzione o 5 secondi dopo l'inizio:
In questo caso, il thread accetta la cancellazione perché i suoi attributi sono impostati su impostazione predefinita alla creazione specificando un puntatore nullo negli argomenti di input "attr" della funzione pThread_create ().
Errori nell'uso della funzione pThread_cancel (): cosa sono e come identificarli
Il modo per determinare se si verifica un errore quando si chiama questa funzione è utilizzare una condizione "if" in cui la condizione di input è un risultato di restituzione diverso da zero. Di seguito è riportato uno snippet di codice utilizzando questo metodo per il rilevamento degli errori:
if (pThread_cancel (thread) != 0)L'unico errore che questa funzione può generare è quello definito come isrch in "errno.H ”intestazione. Questo errore viene generato quando un thread inesistente viene referenziato nell'argomento di input della funzione pThread_cancel ().
Errori di compilazione nei programmi con thread
Quando si compilano i programmi GCC che utilizzano i thread, la compilation potrebbe fallire se non viene eseguita correttamente dalla riga di comando.
Il messaggio di errore più comune che viene emesso dal compilatore afferma che una delle funzioni del thread a cui ci riferiamo nel codice non è definita.
Questi errori spesso comportano perdere tempo prezioso controllando le intestazioni che abbiamo inserito nel codice, la loro integrità e le directory associate al compilatore poiché tutto indica che il problema è lì.
Sebbene le funzioni che causano l'errore siano definite in “Pthread.H" Intestazione e sono inclusi nel codice, il compilatore non riconosce queste funzioni a meno che la libreria PThread non venga chiamata dalla riga di comando durante la compilation.
Puoi vedere in verde il modo corretto di chiamare la libreria PThread dalla console di comando durante la compilazione di programmi con thread di seguito:
~ $ GCC -PThread Path/FileName.c -o out_nameCome possiamo vedere nella figura seguente, l'errore scompare quando viene chiamata la libreria PThread durante la compilazione:
Conclusione
In questo articolo di Linux, ti abbiamo mostrato come utilizzare la funzione pThread_cancel () per chiedere al sistema di terminare un thread in esecuzione.
Abbiamo esaminato una descrizione teorica di questa funzione e ti abbiamo mostrato la sua sintassi, gli argomenti di input e output e il tipo di dati che ciascuno di essi accetta. Dopodiché, abbiamo implementato ciò che abbiamo imparato attraverso un esempio pratico con frammenti di codice e immagini in cui abbiamo visto come funziona la funzione pThread_cancel () nella lingua C.
Abbiamo anche aggiunto una sezione speciale in cui ti abbiamo mostrato come compilare correttamente i programmi che contengono thread e funzioni dalla libreria PThread.