Semafoare POSIX în C

Semafoare Posix In C



„Deși fiecare limbaj de programare are multe biblioteci pentru scopuri specifice, biblioteca POSIX din C își are locul. A fost conceput pentru a crea o mare armonizare între procese și ajută foarte mult la utilizarea multithreading-ului în cadrul programelor, adică la crearea mai multor fire și sincronizarea execuției acestora. În cadrul acestui ghid de astăzi, veți vedea o ilustrare simplă a utilizării semaforelor POSIX în C. Pentru exemplele de cod de bază C, trebuie să configuram compilatorul acestuia în sistem. Dar, înainte de asta, trebuie să actualizăm sistemul, deoarece este un pas necesar pentru executarea fără probleme a codului. Astfel, interogarea afișată în snap-ul atașat este o necesitate pentru a vă actualiza și actualiza sistemul de operare Linux cu utilitarul „apt”.


Acest proces a necesitat aproximativ 55 Kb de spațiu pe platforma dvs. Linux pentru a efectua fără probleme actualizările. Dacă sunteți dispus să acordați atât de mult spațiu, atingeți „y” pentru a continua. Procesarea va fi finalizată în câteva minute.








După ce sistemul a fost complet actualizat, vom configura compilatorul limbajului C în sistemul nostru cu utilitarul apt-get din comanda „instalare”. Folosiți „gcc” ca cuvânt cheie și asta este tot.





semi_init()

Un semafor proaspăt ar fi creat atunci când există deja un semafor neidentificat la „s”; în caz contrar, acel semafor deja existent va fi eliminat. Pe parcursul acestei metode, „s” reprezintă o instanță Semaphore care a fost construită și partajat este un semnal sau un fanion care indică dacă semaforul poate fi distribuit cu o metodă forked() sau altfel. Valoarea de intrare servește ca punct de început al semaforului.





Int sem_init ( nor_t * s, int partajat, unsigned int valoare ) ;

Sem_wait()

Prin executarea unei acțiuni de blocare a semaforului asupra semaforului care este specificat prin „s”, metoda sem_wait() deține acel semafor. Procedura sem-wait va fi folosită pentru a reține un semafor sau pentru a-l lăsa să stea la rând. Unele dintre procesele supraîncărcate anterior se trezesc când un alt proces invocă sem_post().



int sem_wait ( nor_t * s ) ;

no_post()

Când se apelează postarea sem, valoarea este mărită și apoi începe să ruleze una dintre operațiunile pentru care s-a făcut backup sau în așteptare, adică deblochează semaforul deja blocat.

int sem_post ( nor_t * s ) ;

nu_distruge()

Un semafor fără nume inițializat „s” este distrus utilizând funcția sem destroy().

int sem_destroy ( nor_t * s ) ;

Exemplu

Pentru a înțelege semaforele, vom crea mai întâi un fișier C și apoi vom adăuga un cod la acesta. Pentru a crea unul, utilizați interogarea „atingere” și veți găsi noul fișier în folderul principal al sistemului dumneavoastră.


Acum, trebuie să deschideți fișierul C gol cu ​​un editor simplu pentru a genera cod bun în el. Am încercat până acum editorul „nano”, așa cum se arată în imaginea de mai jos.


După cum știm cu toții, toate limbajele de programare nu pot funcționa fără biblioteci, deoarece aceste biblioteci dețin un număr mare de clase, structuri, funcții și obiecte pentru a fi utilizate pentru funcționarea generală a sistemului. Așa că începem acest program C cu utilizarea unor biblioteci de bază și obligatorii pentru semaforele POSIX.

Pentru a folosi aceste biblioteci în cod, trebuie să folosim caracterul „#” cu cuvântul cheie „include” pentru fiecare bibliotecă. În acest moment, am adăugat un total de 4 biblioteci care trebuie să le aibă în acest program. În caz contrar, programul nostru nu va funcționa corect. Prima bibliotecă de antet „stdio.h” este de obicei o necesitate în fiecare program C, deoarece ne permite să avem operații de intrare și ieșire în cod. Prin urmare, îl folosim pentru a adăuga fără probleme intrări și a obține rezultate din cod. A doua bibliotecă pe care o folosim aici este „pthread.h”, care este o necesitate pentru utilizarea programării thread-ului, adică multithreading.

Vom folosi această bibliotecă pentru a crea fire într-un program. Următoarea și cea mai importantă bibliotecă din acest cod este „semaphore.h”. A fost folosit pentru a sincroniza fără probleme firele. Nu în ultimul rând, biblioteca este „unistd.h”, ceea ce ne permite să folosim funcții și constante diverse definite de utilizator. Acum, am declarat semaforul „s” folosind obiectul încorporat „sem_t” al bibliotecii de semafore. Aici vine funcția definită de utilizator de fir „T” fără tip de returnare. A folosit câteva funcții de semafor încorporate pentru a efectua sincronizarea. Funcția sem_wait() este aici pentru a menține semaforul „s” folosind caracterul „&”.

În timpul reținerii, instrucțiunea printf() a fost executată împreună cu funcția „sleep” pentru a face acest program să dorm timp de 4 secunde. O altă instrucțiune printf() afișează un mesaj nou, iar funcția sem_post() este executată pentru a elibera blocarea semaforului „s”.

#include
#include
#include
#include
nici_t s;
gol * T ( gol * arg ) {
sem_wait ( & s ) ;
printf ( 'Bine ati venit! \n ' ) ;
dormi ( 4 ) ;
printf ( 'Pa! \n ' ) ;
semi_post ( & s ) ;
}



Să aruncăm o privire atentă la metoda main() a acestui program C pentru semafoare. Funcția sem_init() a fost utilizată aici pentru a crea un nou semafor „s” care nu a fost distribuit cu o metodă forked(), adică „0”, iar punctul său de pornire este setat la 1. Obiectul pthread_t din pthread Biblioteca C a fost folosită pentru a crea două fire folosind două obiecte thread, o1 și o2. Instrucțiunea printf() este aici pentru a arăta că vom crea primul fir folosind funcția pthread_create() chiar la următoarea linie.

Am trecut obiectul thread o1 acestei funcții cu restricții NULL și am apelat funcția „T” pasând-o în parametri. După un somn de 4 secunde, a fost creat un alt thread cu obiectul o2, iar funcția pthread_join() este utilizată aici pentru a uni firele cu o funcție main(). Funcția sem_destroy() este aici pentru a distruge semaforul „s”, iar toate firele blocate vor fi de asemenea eliberate.

int principal ( ) {
semi_init ( & s, 0 , 1 ) ;
pthread_t o1, o2;
printf ( „Într-un prim thread acum... \n ' ) ;
pthread_create ( & o1, NULL, T, NULL ) ;
dormi ( 4 ) ;
printf ( „Într-un al doilea thread acum... \n ' ) ;
pthread_create ( & o2, NULL, T, NULL ) ;
pthread_join ( o1, NULL ) ;
pthread_join ( o2, NULL ) ;
nu_distruge ( & s ) ;
întoarcere 0 ;
}



Compilăm programul C cu compilatorul „Gcc”; opțiunile „-lrt” și „-lpthread” sunt utilizate pentru executarea funcțiilor thread-ului POSIX. La rularea interogării „.a/.out”, a fost creat primul fir. Intră în stare de repaus după imprimarea primului mesaj.


Al doilea fir s-a sincronizat, iar după 4 secunde, primul fir a fost eliberat, iar al doilea fir s-a blocat timp de 4 secunde.


Până la urmă, a fost lansat și al doilea thread.

Concluzie

Asta este despre semaforele POSIX în C, folosind în același timp unele dintre funcțiile sale principale pentru a sincroniza diferite fire. După ce parcurgeți acest articol, veți putea înțelege din ce în ce mai mult POSIX.