POSIX semaforen in C

Posix Semaforen In C



“Hoewel elke programmeertaal veel bibliotheken heeft voor specifieke doeleinden, heeft de POSIX-bibliotheek van C zijn plaats. Het is ontworpen om een ​​grote harmonisatie tussen de processen te creëren en helpt veel bij het gebruik van multithreading binnen de programma's, d.w.z. het creëren van meerdere threads en het synchroniseren van hun uitvoering. In deze gids van vandaag ziet u een eenvoudige illustratie van het gebruik van POSIX-semaforen in C. Voor de standaard C-codevoorbeelden moeten we de compiler in het systeem configureren. Maar daarvoor moeten we het systeem bijwerken, omdat dit een noodzakelijke stap is voor een soepele uitvoering van code. De query die in de bijgevoegde module wordt weergegeven, is dus een must om uw Linux-besturingssysteem bij te werken en te upgraden met het hulpprogramma 'apt'.


Dit proces vereiste ongeveer 55 Kb ruimte op uw Linux-platform om de updates soepel uit te voeren. Als je bereid bent zoveel ruimte te geven, tik je op 'y' om door te gaan. De verwerking is binnen enkele minuten voltooid.








Nadat het systeem volledig is geüpgraded, gaan we de compiler van de C-taal in ons systeem configureren met het hulpprogramma apt-get in de opdracht 'install'. Gebruik 'gcc' als trefwoord, en dat is alles.





sem_init()

Een nieuwe semafoor zou worden gemaakt als er al een niet-geïdentificeerde semafoor op 's' staat; anders wordt die reeds bestaande semafoor weggegooid. In deze methode staat 's' voor een Semaphore-instantie die is geconstrueerd, en gedeeld is een signaal of wimpel die aangeeft of de semafoor mag worden gedistribueerd met een forked()-methode of anderszins. De invoerwaarde dient als het ingestelde beginpunt van de semafoor.





Int sem_init ( nor_t * s, int gedeeld, niet-ondertekende int-waarde ) ;

Sem_wait()

Door een semafoorvergrendelingsactie uit te voeren op de semafoor die wordt gespecificeerd door 's', houdt de methode sem_wait() die semafoor vast. De sem-wait procedure wordt gebruikt om een ​​semafoor vast te houden of in de rij te laten staan. Sommige van de eerder overbelaste processen ontwaken wanneer een ander proces sem_post() aanroept.



int sem_wait ( nor_t * s ) ;

geen bericht()

Wanneer sem post wordt aangeroepen, wordt de waarde verhoogd, en dan begint een van de eerder geback-upte of wachtende bewerkingen te lopen, d.w.z. de reeds vergrendelde semafoor wordt ontgrendeld.

int sem_post ( nor_t * s ) ;

no_destroy()

Een geïnitialiseerde naamloze semafoor 's' wordt vernietigd met behulp van de functie sem destroy().

int sem_destroy ( nor_t * s ) ;

Voorbeeld

Om de semaforen te begrijpen, gaan we eerst een C-bestand maken en er vervolgens een code aan toevoegen. Om er een te maken, gebruikt u de 'touch' -query en u zult het nieuwe bestand in de thuismap van uw systeem vinden.


Nu moet je je lege C-bestand openen met een eenvoudige editor om er goede code in te genereren. We hebben tot nu toe de 'nano' -editor geprobeerd, zoals weergegeven in de onderstaande module.


Zoals we allemaal weten, kunnen alle programmeertalen niet werken zonder bibliotheken, aangezien deze bibliotheken een groot aantal klassen, structuren, functies en objecten bevatten die kunnen worden gebruikt voor de algehele werking van het systeem. Dus we starten dit C-programma met het gebruik van enkele basis- en onmisbare bibliotheken voor de POSIX Semaphores.

Om deze bibliotheken in de code te gebruiken, moeten we voor elke bibliotheek het teken '#' met het trefwoord 'include' gebruiken. Op dit moment hebben we in totaal 4 bibliotheken toegevoegd die je in dit programma moet hebben. Anders werkt ons programma niet correct. De eerste 'stdio.h' header-bibliotheek is meestal een must-have in elk C-programma, omdat het ons in staat stelt invoer- en uitvoerbewerkingen in de code te hebben. Daarom gebruiken we het om soepel invoer toe te voegen en uitvoer uit de code te halen. De tweede bibliotheek die we hier gebruiken, is de 'pthread.h' die een must is voor het gebruik van threadprogrammering, d.w.z. multithreading.

We zullen deze bibliotheek gebruiken om threads in een programma te maken. De volgende en belangrijkste bibliotheek in deze code is de 'semafoor.h'. Het is gebruikt om de threads soepel te synchroniseren. Last but not least, de bibliotheek is 'unistd.h', wat ons in staat stelt om door de gebruiker gedefinieerde diverse functies en constanten te gebruiken. Nu hebben we de semafoor 's' gedeclareerd met het ingebouwde object 'sem_t' van de semafoorbibliotheek. Hier komt de door de gebruiker gedefinieerde draadfunctie 'T' zonder retourtype. Het heeft een aantal ingebouwde semafoorfuncties gebruikt om synchronisatie uit te voeren. De functie sem_wait() is hier om de semafoor 's' vast te houden met het teken '&'.

Binnen de wachtstand werd het printf()-statement uitgevoerd samen met de 'sleep'-functie om dit programma 4 seconden te laten slapen. Een andere printf()-instructie geeft een nieuw bericht weer en de functie sem_post() wordt uitgevoerd om de vergrendeling op semafoor 's' te ontgrendelen.

#include
#include
#include
#include
noch_t s;
leegte * T ( leegte * arg ) {
sem_wait ( & s ) ;
printf ( 'Welkom! \n ' ) ;
slaap ( 4 ) ;
printf ( 'Doei! \n ' ) ;
sem_post ( & s ) ;
}



Laten we eens goed kijken naar de methode main() van dit C-programma voor semaforen. De functie sem_init() is hier gebruikt om een ​​nieuwe semafoor 's' te maken die niet is gedistribueerd met een forked()-methode, d.w.z. '0', en het startpunt is ingesteld op 1. Het pthread_t-object van de pthread bibliotheek van C werd gebruikt om twee threads te maken met behulp van twee thread-objecten, o1 en o2. De printf()-instructie is hier om aan te geven dat we de eerste thread gaan maken met de functie pthread_create() op de volgende regel.

We hebben het o1-thread-object aan deze functie doorgegeven met NULL-beperkingen en de functie 'T' aangeroepen door het in de parameters door te geven. Na een slaapstand van 4 seconden werd een andere thread gemaakt met object o2 en de functie pthread_join() wordt hier gebruikt om de threads samen te voegen met een main()-functie. De functie sem_destroy() is hier om de semafoor 's' te vernietigen, en alle geblokkeerde threads worden ook vrijgegeven.

int hoofd ( ) {
sem_init ( & s, 0 , 1 ) ;
pthread_t o1, o2;
printf ( 'In een 1e draad nu... \n ' ) ;
pthread_create ( & o1,NULL,T,NULL ) ;
slaap ( 4 ) ;
printf ( 'In een 2e draad nu... \n ' ) ;
pthread_create ( & o2,NULL,T,NULL ) ;
pthread_join ( o1,NULL ) ;
pthread_join ( o2,NULL ) ;
no_destroy ( & s ) ;
opbrengst 0 ;
}



We compileren het C-programma met de 'Gcc' -compiler; de opties '-lrt' en '-lpthread' worden gebruikt voor het uitvoeren van de POSIX-threadfuncties. Bij het uitvoeren van de '.a/.out'-query werd de eerste thread gemaakt. Het gaat in slaapstand na het afdrukken van het eerste bericht.


De tweede thread werd gesynchroniseerd en na 4 seconden werd de eerste thread vrijgegeven en werd de tweede thread 4 seconden vergrendeld.


Uiteindelijk werd ook de tweede thread vrijgegeven.

Conclusie

Dat is het over de POSIX-semaforen in C, terwijl ze enkele van de belangrijkste functies ervan gebruiken om verschillende threads te synchroniseren. Na het doornemen van dit artikel zul je POSIX steeds beter kunnen begrijpen.