POSIX Semaforer i C

Posix Semaforer I C



“Selvom hvert programmeringssprog har mange biblioteker til specifikke formål, har POSIX-biblioteket i C sin plads. Det er designet til at skabe en stor harmonisering mellem processerne og hjælper meget med at bruge multithreading i programmerne, dvs. at skabe flere tråde og synkronisere deres eksekvering. I denne guide i dag vil du se en simpel illustration af brugen af ​​POSIX semaforer i C. For de grundlæggende C-kodeeksempler skal vi konfigurere dens compiler i systemet. Men før det er vi nødt til at opdatere systemet, da det er et nødvendigt trin for en glat udførelse af kode. Således er forespørgslen, der vises i det vedhæftede snap, et must-have for at opdatere og opgradere dit Linux-operativsystem med 'apt'-værktøjet.'


Denne proces krævede cirka 55 Kb plads på din Linux-platform for at udføre opdateringerne problemfrit. Hvis du er villig til at give så meget plads, skal du trykke på 'y' for at fortsætte. Behandlingen vil blive afsluttet om nogle minutter.








Efter at systemet er blevet fuldt opgraderet, vil vi konfigurere compileren af ​​C-sproget i vores system med apt-get-værktøjet i 'install'-kommandoen. Brug 'gcc' som et nøgleord, og det er det.





sem_init()

En frisk semafor ville blive oprettet, når der allerede er en uidentificeret semafor ved 's'; ellers vil den allerede eksisterende semafor blive kasseret. Gennem denne metode står 's' for en semafor-instans, der er blevet konstrueret, og delt er et signal eller en vimpel, der angiver, om semaforen kan distribueres med en forked()-metode eller på anden måde. Indgangsværdien fungerer som semaforens indstillede begyndelsespunkt.





Int sem_init ( heller_t * s, int delt, usigneret int værdi ) ;

Sem_vent()

Ved at udføre en semaforlåsehandling på semaforen, der er specificeret af 's', holder sem_wait()-metoden denne semafor. Sem-vent proceduren vil blive brugt til at beholde en semafor eller lade den stå i kø. Nogle af de tidligere overbelastede processer vågner, når en anden proces kalder sem_post().



int sem_wait ( heller_t * s ) ;

no_post()

Når sem post kaldes, øges værdien, og derefter begynder en af ​​de tidligere sikkerhedskopierede eller afventende operationer at køre, dvs. låser den allerede låste semafor op.

int sem_post ( heller_t * s ) ;

no_destroy()

En initialiseret navnløs semafor 's' destrueres ved at bruge funktionen sem destroy().

int sem_destroy ( heller_t * s ) ;

Eksempel

For at forstå semaforerne skal vi først oprette en C-fil og derefter tilføje en kode til den. For at oprette en, brug 'touch'-forespørgslen, og du vil finde den nye fil i dit systems hjemmemappe.


Nu skal du åbne din tomme C-fil med en simpel editor for at generere god kode i den. Vi har prøvet 'nano'-editoren indtil videre, som vist i snappet nedenfor.


Som vi alle ved, at alle programmeringssprog ikke kan fungere uden biblioteker, da disse biblioteker rummer et stort antal klasser, strukturer, funktioner og objekter, der skal bruges til overordnet systemarbejde. Så vi starter dette C-program med brugen af ​​nogle grundlæggende og must-have biblioteker til POSIX Semaforerne.

For at bruge disse biblioteker i koden, skal vi bruge tegnet '#' med nøgleordet 'inkluder' for hvert bibliotek. Lige nu har vi tilføjet i alt 4 biblioteker, som er must at have i dette program. Ellers vil vores program ikke fungere korrekt. Det første 'stdio.h'-headerbibliotek er normalt et must-have i hvert C-program, fordi det giver os mulighed for at have input- og output-operationer i koden. Derfor bruger vi det til nemt at tilføje input og få output fra koden. Det andet bibliotek, vi bruger her, er 'pthread.h', der er et must for brugen af ​​trådprogrammering, dvs. multithreading.

Vi vil bruge dette bibliotek til at oprette tråde i et program. Det næste og vigtigste bibliotek i denne kode er 'semaphore.h'. Det er blevet brugt til jævnt at synkronisere trådene. Sidst men ikke mindst er biblioteket 'unistd.h', hvilket gør os i stand til at bruge brugerdefinerede diverse funktioner og konstanter. Nu har vi erklæret 's' semaforen ved at bruge det 'sem_t' indbyggede objekt i semaforbiblioteket. Her kommer trådens brugerdefinerede funktion 'T' uden returtype. Den har brugt nogle indbyggede semaforfunktioner til at udføre synkronisering. Sem_wait()-funktionen er her for at holde semaforen 's' ved at bruge tegnet '&'.

Inden for hold blev printf()-sætningen eksekveret sammen med 'sleep'-funktionen for at få dette program til at sove i 4 sekunder. En anden printf()-sætning viser en ny besked, og sem_post()-funktionen bliver udført for at frigive låsen på semaforen 's.'

#include
#include
#include
#include
hverken_t s;
ugyldig * T ( ugyldig * arg ) {
sem_vent ( & s ) ;
printf ( 'Velkommen! \n ' ) ;
søvn ( 4 ) ;
printf ( 'Farvel! \n ' ) ;
sem_post ( & s ) ;
}



Lad os tage et godt kig på hoved()-metoden i dette C-program til semaforer. Sem_init() funktionen er blevet brugt her til at skabe en ny semafor 's', der ikke er blevet distribueret med en forked() metode, dvs. '0', og dens startpunkt er sat til 1. pthread_t objektet fra pthreaden bibliotek af C blev brugt til at oprette to tråde ved hjælp af to trådobjekter, o1 og o2. Printf()-sætningen er her for at vise, at vi vil oprette den første tråd ved hjælp af funktionen pthread_create() på den aller næste linje.

Vi har sendt o1-trådobjektet til denne funktion med NULL-begrænsninger og kalder funktionen 'T' ved at sende det i parametrene. Efter en dvale på 4 sekunder blev der oprettet endnu en tråd med objekt o2, og funktionen pthread_join() bruges her til at forbinde trådene med en main() funktion. Sem_destroy() funktionen er her for at ødelægge 's' semaforen, og alle de blokerede tråde vil også blive frigivet.

int main ( ) {
sem_init ( & s, 0 , 1 ) ;
pthread_t o1, o2;
printf ( 'I en 1. tråd nu... \n ' ) ;
pthread_create ( & o1,NULL,T,NULL ) ;
søvn ( 4 ) ;
printf ( 'I en anden tråd nu... \n ' ) ;
pthread_create ( & o2,NULL,T,NULL ) ;
pthread_join ( o1,NULL ) ;
pthread_join ( o2,NULL ) ;
no_destroy ( & s ) ;
Vend tilbage 0 ;
}



Vi kompilerer C-programmet med 'Gcc'-kompileren; indstillingerne '-lrt' og '-lpthread' bruges til at udføre POSIX-trådsfunktionerne. Ved at køre '.a/.out'-forespørgslen blev den første tråd oprettet. Den går i dvale efter udskrivning af den første besked.


Den anden tråd blev synkroniseret, og efter 4 sekunder blev den første tråd sluppet, og den anden tråd blev låst i 4 sekunder.


Til sidst blev den anden tråd også sluppet.

Konklusion

Det er det om POSIX Semaforerne i C, mens de bruger nogle af dets hovedfunktioner til at synkronisere forskellige tråde. Efter at have gennemgået denne artikel, vil du være i stand til at forstå POSIX mere og mere.