POSIX Semafori in C

Posix Semafori In C



“Sebbene ogni linguaggio di programmazione abbia molte librerie per scopi specifici, la libreria POSIX di C ha il suo posto. È stato progettato per creare una grande armonizzazione tra i processi e aiuta molto nell'uso del multithreading all'interno dei programmi, ovvero nella creazione di più thread e nella sincronizzazione della loro esecuzione. All'interno di questa guida oggi, vedrai una semplice illustrazione dell'uso dei semafori POSIX in C. Per gli esempi di codice C di base, dobbiamo configurare il suo compilatore nel sistema. Ma, prima, dobbiamo aggiornare il sistema in quanto è un passaggio necessario per l'esecuzione regolare del codice. Pertanto, la query visualizzata nello snap allegato è un must per aggiornare e aggiornare il tuo sistema operativo Linux con l'utilità 'apt'.


Questo processo ha richiesto circa 55 Kb di spazio sulla tua piattaforma Linux per eseguire gli aggiornamenti senza problemi. Se sei disposto a dare così tanto spazio, tocca 'y' per continuare. L'elaborazione sarà completata in pochi minuti.








Dopo che il sistema è stato completamente aggiornato, configureremo il compilatore del linguaggio C nel nostro sistema con l'utilità apt-get nel comando 'install'. Usa 'gcc' come parola chiave e il gioco è fatto.





semi_inizializzazione()

Verrebbe creato un nuovo semaforo quando c'è già un semaforo non identificato in 's'; in caso contrario, quel semaforo già esistente verrà eliminato. In questo metodo, 's' sta per un'istanza Semaphore che è stata costruita e condivisa è un segnale o pennant che indica se il semaforo può essere distribuito con un metodo fork() o altro. Il valore di input funge da punto iniziale impostato per il semaforo.





Int sem_init ( né_t * s, int condiviso, valore int senza segno ) ;

Sem_aspetta()

Eseguendo un'azione di blocco del semaforo sul semaforo specificato da 's', il metodo sem_wait() mantiene quel semaforo. La procedura di attesa verrà utilizzata per mantenere un semaforo o lasciarlo in linea. Alcuni dei processi precedentemente sovraccaricati si risvegliano quando qualche altro processo invoca sem_post().



int sem_wait ( né_t * S ) ;

no_post()

Quando viene chiamato sem post, il valore viene aumentato, quindi una delle operazioni precedentemente salvate o in attesa inizia a funzionare, ovvero sblocca il semaforo già bloccato.

int sem_post ( né_t * S ) ;

no_distruggere()

Un semaforo senza nome 's' inizializzato viene distrutto utilizzando la funzione sem destroy().

int sem_distruggi ( né_t * S ) ;

Esempio

Per comprendere i semafori, creeremo prima un file C e quindi aggiungeremo un codice. Per crearne uno, usa la query 'touch' e troverai il nuovo file nella cartella home del tuo sistema.


Ora devi aprire il tuo file C vuoto con un semplice editor per generare un buon codice al suo interno. Finora abbiamo provato l'editor 'nano', come mostrato nello snap qui sotto.


Come tutti sappiamo, tutti i linguaggi di programmazione non possono funzionare senza librerie poiché queste librerie contengono un gran numero di classi, strutture, funzioni e oggetti da utilizzare per il funzionamento generale del sistema. Quindi stiamo iniziando questo programma C con l'uso di alcune librerie di base e indispensabili per i semafori POSIX.

Per utilizzare queste librerie nel codice, dobbiamo utilizzare il carattere “#” con la parola chiave “include” per ciascuna libreria. In questo momento, abbiamo aggiunto un totale di 4 librerie che devono avere in questo programma. Altrimenti, il nostro programma non funzionerà correttamente. La prima libreria di intestazione 'stdio.h' è solitamente un must in ogni programma C perché ci consente di avere operazioni di input e output nel codice. Pertanto, lo stiamo usando per aggiungere senza problemi input e ottenere output dal codice. La seconda libreria che stiamo usando qui è 'pthread.h' che è un must per l'uso della programmazione dei thread, ovvero il multithreading.

Useremo questa libreria per creare thread in un programma. La libreria successiva e più importante in questo codice è 'semaphore.h'. È stato utilizzato per sincronizzare senza problemi i thread. Ultimo ma non meno importante, la libreria è 'unistd.h', che ci consente di utilizzare funzioni e costanti varie definite dall'utente. Ora, abbiamo dichiarato il semaforo 's' utilizzando l'oggetto integrato 'sem_t' della libreria del semaforo. Ecco che arriva la funzione definita dall'utente del thread 'T' senza tipo di ritorno. Ha utilizzato alcune funzioni di semaforo integrate per eseguire la sincronizzazione. La funzione sem_wait() è qui per contenere il semaforo 's' usando il carattere '&'.

All'interno della sospensione, l'istruzione printf() è stata eseguita insieme alla funzione 'sleep' per far dormire questo programma per 4 secondi. Un'altra istruzione printf() visualizza un nuovo messaggio e la funzione sem_post() viene eseguita per rilasciare il blocco sul semaforo 's'.

#include
#include
#include
#include
né_t s;
vuoto * T ( vuoto * arg ) {
sem_aspetta ( & S ) ;
stampa f ( 'Ben arrivato! \n ' ) ;
dormire ( 4 ) ;
stampa f ( 'Ciao! \n ' ) ;
sem_post ( & S ) ;
}



Diamo una buona occhiata al metodo main() di questo programma C per i semafori. La funzione sem_init() è stata utilizzata qui per creare un nuovo semaforo “s” che non è stato distribuito con un metodo forked(), ovvero “0”, e il suo punto iniziale è impostato su 1. L'oggetto pthread_t dal pthread la libreria di C è stata utilizzata per creare due thread usando due oggetti thread, o1 e o2. L'istruzione printf() è qui per mostrare che creeremo il primo thread usando la funzione pthread_create() alla riga successiva.

Abbiamo passato l'oggetto thread o1 a questa funzione con restrizioni NULL e abbiamo chiamato la funzione 'T' passandolo nei parametri. Dopo una sospensione di 4 secondi, è stato creato un altro thread con l'oggetto o2 e la funzione pthread_join() viene utilizzata qui per unire i thread con una funzione main(). La funzione sem_destroy() è qui per distruggere il semaforo 's' e anche tutti i thread bloccati verranno rilasciati.

int principale ( ) {
semi_iniziale ( & S, 0 , 1 ) ;
pthread_t o1, o2;
stampa f ( 'In una prima discussione ora... \n ' ) ;
pthread_create ( & o1,NULLA,T,NULLA ) ;
dormire ( 4 ) ;
stampa f ( 'In una seconda discussione ora... \n ' ) ;
pthread_create ( & o2,NULLA,T,NULLA ) ;
pthread_join ( o1, NULLA ) ;
pthread_join ( o2, NULLA ) ;
no_distruggere ( & S ) ;
Restituzione 0 ;
}



Stiamo compilando il programma C con il compilatore “Gcc”; le opzioni “-lrt” e “-lpthread” vengono utilizzate per eseguire le funzioni del thread POSIX. Durante l'esecuzione della query '.a/.out', è stato creato il primo thread. Va a dormire dopo aver stampato il primo messaggio.


Il secondo thread è stato sincronizzato e, dopo 4 secondi, il primo thread è stato rilasciato e il secondo thread è stato bloccato per 4 secondi.


Alla fine, anche il secondo thread è stato rilasciato.

Conclusione

Questo è tutto sui semafori POSIX in C mentre si utilizzano alcune delle sue funzioni principali per sincronizzare thread diversi. Dopo aver esaminato questo articolo, sarai in grado di capire sempre di più POSIX.