Hvorfor brukes semaforer?
Mens vi bruker tråder, møter vi flere betingede problemer som involverer raseforhold. Dette skjer når to eller flere tråder trenger samme data eller informasjon samtidig som forårsaker konflikt. Så for å unngå denne typen motstridende situasjoner, bruker vi semaforer. Det er tre hovedtyper av semaforer. Den ene er en binær semafor, og en annen er en tellende semafor.
Vi bruker forskjellige funksjoner i semaforen som SEM_WAIT, SEM_POST og SEM_INIT. Sem_init er temaet som vurderes videre i denne artikkelen.
Sem_init
Som vi diskutert ovenfor, for å initialisere semaforen i tråder, bruker vi SEM_Init -funksjonen. Her bruker vi et flagg eller et banner som identifiserer delingen av semaforen med gaffel () prosedyre.
Syntaks
# sem_init (sem *sem, int pshared, int value (usignert));
Sem: Denne funksjonen hjelper semaforen til å være i en klar tilstand.
Pshared: Dette parameterargumentet er grunnleggende i erklæringen om semaforen. Som det bestemmer statusen til den nylig initialiserte semaforen. Hvorvidt det skal deles mellom prosessene eller trådene eller ikke. Hvis verdien er ikke-null, betyr det at semaforen deles mellom to eller flere prosesser, og hvis verdien er null, betyr det at semaforen deles mellom trådene.
Verdi: Den spesifiserer verdien som skal tildeles den nyopprettede semaforen som tilordnes innledningsvis.
Implementering av sem_init
For å utføre semaforer i C -programmet, trenger vi en GCC -kompilator. Men dette er ikke tilstrekkelig. “-Lpthread” brukes til å utføre koden. 'en.C 'er filnavnet. En annen ting er at vi her bruker '.ut 'med filnavnet i stedet for å bruke filen uavhengig.
Eksempel 1
Først legger vi til to biblioteker som har semaforer og pthread for å unne seg bruken av C -pakker. Som sem_init brukes andre semaforer i dette programmet; Her vil vi diskutere dem.
Sem_wait ()
Denne funksjonen brukes til å holde en semafor eller å fortsette å vente. Hvis verdien som gis til semaforen er negativ, er samtalen blokkert, og syklusen er lukket. Mens enhver annen tråd, når de blir kalt, blir de blokkerte semaforene vekket.
Sem_post ()
SEM_POST -metoden brukes til å øke semaforverdien. Verdien økes med sem_post når den kalles.
Sem_destroy ()
Hvis vi ønsker å ødelegge semaforen, bruker vi SEM_DESTROY -metoden. Nå igjen, fokus på kildekoden som er gitt her. For det første brukes "vent" -funksjonen her. Det vil få tråden til å vente først slik at andre kan utføre en oppgave. En melding vises at tråden legges inn på å ringe funksjonen. Etter det kreves en "søvn" -funksjon i 5 sekunder.
To tråder opprettes i henhold til hovedfunksjonene, opprettes 2 tråder, men den første sover i 5 sekunder etter at låsen er anskaffet. Så den andre tråden er ikke lagt inn når den heter. Den kommer inn etter 5-2 sekunder når det heter.
SEM_POST vil fungere etter søvnfunksjonen; SEM_POST vil fungere og vise en fullstendig statusmelding. I hovedprogrammet initialiseres semaforen først, og deretter opprettes begge trådene ved hjelp av Pthread. Vi bruker Pthread_Join -funksjonen for å bli med i trådene. Og på slutten blir semaforer ødelagt.
Lagre filen med utvidelsen av .C; Kode vil bli samlet, og utførelsen vil bli gjort. Ved utførelse vil du se at den første meldingen vises, og så tar det noen sekunder å fullføre, da vi har gitt søvnfunksjonen med 5 sekunder, så etter den tid vises den andre meldingen for den første tråden.
Ofte vises den første meldingen for den andre tråden.
Den andre meldingen vil igjen ta tid å fortsette.
Eksempel 2
Før vi beveger oss mot det andre eksemplet, må vi først forstå konseptet med leserens forfatterproblem. Anta at en database du vil dele mellom prosessene, kjører samtidig. Noen av disse prosessene eller trådene kan bare lese databasen. Samtidig kan andre gjerne endre databasen. Vi diskriminerer mellom disse to ved å erklære den første som leser og den andre som forfatter. Hvis to lesere får tilgang til de delte dataene, vil det ikke forårsake noen virkning.
For å minimere forekomsten av denne typen vanskeligheter, må vi hjelpe forfattere med å få tilgang til den delte databasen for å skrive i den. Dette problemet synkroniseres og kjent som Leser-skribentproblemet.
Det er mange varianter i dette problemet. Den første tar for seg problemet som ingen leser vil vente med mindre en forfatter bruker delte objekter.
Dette programmet gir løsningen for det første leserforfatterproblemet. I denne C -kildekoden brukte vi 10 lesere og 5 prosedyrer for å demonstrere løsningen. De to første tellerne er tatt som blir referert til som null. Ikke -leseren identifiserer nummeret på leseren. Når du beveger deg mot forfatterfunksjonen, brukes to semaforfunksjoner her, den første er ventetiden, og sistnevnte er innlegget. Dette vil vise forfatterens nummer.
Etter forfatterfunksjonen er leserfunksjonen erklært her. Forfatteren vil endre databasen slik at leseren ikke kan legge inn eller endre noe som er anskaffet av en lås.
# Pthread_mutex_lock (& mutex);
Ikke -leserantallet blir deretter økt. Her brukes en sjekk på IF-uttalelse. Hvis verdien er 1, betyr det at det er den første leseren slik at forfatteren blir blokkert. Hvis ikke -leseren er 0, etter å ha sjekket, betyr det at det er den siste leseren, så vi vil nå tillate forfatteren for modifiseringen.
# Pthread_mutex_unlock (& mutex);
Vi vil bevege oss mot hovedprogrammet etter både leser- og forfatterfunksjonen. Her har vi initialisert 10 lesere og 5 forfattere. Sem_init -funksjonen vil initialisere semaforen. For løkker brukes her separat for både lesere og forfattere. Pthread_create vil opprette lese- og skrivefunksjonene. Videre vil pthread_join bli med i trådene. Hver for Loop vil bruke dette leddet 5 ganger til skribentformål og deretter 10 ganger for leserformålet.
Og på slutten blir semaforen ødelagt henholdsvis etter bruk. Sett sammen koden og utfør den deretter. Du vil se at tilfeldige tall for leseren genereres innen 10 arraystørrelser med telling 1. Og for forfatteren endres 5 tall.
Konklusjon
Artikkelen 'sem_init' er en funksjon som brukes av semaforene i multithreading -prosessen for å prioritere oppgavene som oppstår samtidig. Det er mange andre funksjoner relatert til semaforer, også diskutert her. Vi har forklart to elementære eksempler for å utdype bruken av sem_init i funksjonene og andre funksjoner.