POSIX semaforer i C

Posix Semaforer I C



'Även om varje programmeringsspråk har många bibliotek för specifika ändamål, har POSIX-biblioteket i C sin plats. Den har utformats för att skapa en stor harmonisering mellan processerna och hjälper mycket med att använda multithreading inom programmen, dvs att skapa flera trådar och synkronisera deras exekvering. I denna guide idag kommer du att se en enkel illustration av hur du använder POSIX semaforer i C. För de grundläggande C-kodexemplen måste vi konfigurera dess kompilator i systemet. Men innan dess måste vi uppdatera systemet eftersom det är ett måste steg för smidig exekvering av kod. Därför är frågan som visas i det bifogade snapet ett måste för att uppdatera och uppgradera ditt Linux-operativsystem med verktyget 'apt'.


Denna process krävde ungefär 55 Kb utrymme på din Linux-plattform för att smidigt utföra uppdateringarna. Om du är villig att ge så mycket utrymme, tryck på 'y' för att fortsätta. Bearbetningen kommer att slutföras inom några minuter.








Efter att systemet har blivit helt uppgraderat kommer vi att konfigurera kompilatorn för C-språket i vårt system med verktyget apt-get i kommandot 'install'. Använd 'gcc' som nyckelord, och det är allt.





sem_init()

En ny semafor skulle skapas när det redan finns en oidentifierad semafor vid 's'; annars kommer den redan befintliga semaforen att kasseras. Genom hela denna metod står 's' för en Semaphore-instans som har konstruerats, och shared är en signal eller vimpel som indikerar om semaforen kan distribueras med en forked()-metod eller på annat sätt. Ingångsvärdet fungerar som semaforens startpunkt.





Int sem_init ( nor_t * s, int shared, unsigned int värde ) ;

Sem_wait()

Genom att utföra en semaforlåsåtgärd på semaforen som specificeras av 's', håller sem_wait()-metoden den semaforen. Semi-wait-proceduren kommer att användas för att behålla en semafor eller låta den stå i kö. Några av de tidigare överbelastade processerna vaknar när någon annan process anropar sem_post().



int sem_wait ( nor_t * s ) ;

no_post()

När sem post anropas, höjs värdet, och sedan börjar en av de tidigare säkerhetskopierade eller väntande operationerna köras, dvs låser upp den redan låsta semaforen.

int sem_post ( nor_t * s ) ;

no_destroy()

En initierad namnlös semafor 's' förstörs med funktionen sem destroy() .

int sem_destroy ( nor_t * s ) ;

Exempel

För att förstå semaforerna ska vi först skapa en C-fil och sedan lägga till en kod till den. För att skapa en, använd 'touch'-frågan, så hittar du den nya filen i ditt systems hemmapp.


Nu måste du öppna din tomma C-fil med någon enkel editor för att skapa bra kod i den. Vi har försökt med 'nano'-redigeraren hittills, som visas på bilden nedan.


Som vi alla vet att alla programmeringsspråk inte kan fungera utan bibliotek eftersom dessa bibliotek har ett stort antal klasser, strukturer, funktioner och objekt som ska användas för att övergripa systemet. Så vi startar detta C-program med användning av några grundläggande och måste-ha-bibliotek för POSIX Semaforerna.

För att använda dessa bibliotek i koden måste vi använda tecknet '#' med nyckelordet 'inkludera' för varje bibliotek. Just nu har vi lagt till totalt 4 bibliotek som är ett måste att ha i det här programmet. Annars kommer vårt program inte att fungera korrekt. Det första 'stdio.h'-huvudbiblioteket är vanligtvis ett måste i varje C-program eftersom det tillåter oss att ha in- och utdataoperationer i koden. Därför använder vi det för att smidigt lägga till indata och få utdata från koden. Det andra biblioteket vi använder här är 'pthread.h' som är ett måste för användning av trådprogrammering, d.v.s. multithreading.

Vi kommer att använda det här biblioteket för att skapa trådar i ett program. Nästa och viktigaste bibliotek i denna kod är 'semaphore.h'. Den har använts för att smidigt synkronisera trådarna. Sist men inte minst är biblioteket 'unistd.h', vilket gör att vi kan använda användardefinierade diverse funktioner och konstanter. Nu har vi deklarerat 's'-semaforen med det inbyggda 'sem_t'-objektet i semaforbiblioteket. Här kommer trådens användardefinierade funktion 'T' utan returtyp. Den har använt några inbyggda semaforfunktioner för att utföra synkronisering. Sem_wait()-funktionen är här för att hålla semaforen 's' med '&'-tecknet.

Inom spärren exekverades printf()-satsen tillsammans med 'sleep'-funktionen för att få detta program att vila i 4 sekunder. En annan printf()-sats visar ett nytt meddelande, och funktionen sem_post() exekveras för att frigöra låset på semaforen 's.'

#include
#include
#inkludera
#include
varken_t s;
tomhet * T ( tomhet * arg ) {
sem_vänta ( & s ) ;
printf ( 'Välkommen! \n ' ) ;
sova ( 4 ) ;
printf ( 'Hejdå! \n ' ) ;
sem_post ( & s ) ;
}



Låt oss ta en ordentlig titt på huvudmetoden() för detta C-program för semaforer. Funktionen sem_init() har använts här för att skapa en ny semafor 's' som inte har distribuerats med en forked()-metod, dvs. '0', och dess startpunkt är satt till 1. pthread_t-objektet från pthreaden biblioteket i C användes för att skapa två trådar med två trådobjekt, o1 och o2. Uttrycket printf() är här för att visa att vi kommer att skapa den första tråden med funktionen pthread_create() på nästa rad.

Vi har skickat o1-trådobjektet till denna funktion med NULL-begränsningar och anropat funktionen 'T' genom att skicka det i parametrarna. Efter en sömn på 4 sekunder skapades en annan tråd med objekt o2, och funktionen pthread_join() används här för att sammanfoga trådarna med en main()-funktion. Funktionen sem_destroy() är här för att förstöra 's' semaforen, och alla blockerade trådar kommer också att släppas.

int main ( ) {
sem_init ( & s, 0 , 1 ) ;
pthread_t o1, o2;
printf ( 'I en första tråd nu... \n ' ) ;
pthread_create ( & o1,NULL,T,NULL ) ;
sova ( 4 ) ;
printf ( 'I en andra tråd nu... \n ' ) ;
pthread_create ( & o2,NULL,T,NULL ) ;
pthread_join ( o1,NULL ) ;
pthread_join ( o2,NULL ) ;
no_destroy ( & s ) ;
lämna tillbaka 0 ;
}



Vi kompilerar C-programmet med 'Gcc'-kompilatorn; alternativen '-lrt' och '-lpthread' används för att utföra POSIX-trådsfunktionerna. När '.a/.out'-frågan kördes skapades den första tråden. Den går i viloläge efter att ha skrivit ut det första meddelandet.


Den andra tråden synkroniserades och efter 4 sekunder släpptes den första tråden och den andra tråden låstes i 4 sekunder.


Till slut släpptes även den andra tråden.

Slutsats

Det handlar om POSIX Semaforerna i C samtidigt som de använder några av dess huvudfunktioner för att synkronisera olika trådar. Efter att ha gått igenom den här artikeln kommer du att kunna förstå POSIX mer och mer.