POSIX Semafoorid C -programmeerimisega

Posix Semaphores With C Programming

POSIX viitab OS -i kaasaskantavale liidesele, mis on IEEE -standard, mis on välja töötatud erinevate rakenduste teisaldatavuse hõlbustamiseks. POSIX on püüdlus luua müüjate koostöös UNIXi ühine standardversioon. See lihtsustaks rakenduste teisaldamist riistvaraplatvormide vahel, kui need on tõhusad. Hewlett-Packard integreerib POSIXi vastavalt litsentsitud MPE/iX OS versiooni 5.0 ja HP/UXX versiooni 10.0 (selle UNIX).

POSIX -standardil on palju rohkem kui kümme osa, kuid kaks on kergesti kättesaadavad. POSIX.1 kirjeldab C -programmeerimisliideseid (st süsteemikõnede kogu) failide, protseduuride ja I/O -terminalide jaoks. POSIX -platvormide jaoks mõeldud C POSIX -i pakenditeek on C -standardraamatukogu raamistik. See on kehtestatud samal ajal standardse ANSI C -ga. Et muuta POSIX standardiga C ühilduvaks, on tehtud mitmeid katseid. POSIX pakub lisavõimalusi standardis C rakendatule.

POSIX Semafoorid

Semafoor on andmestruktuur, mida sageli kasutatakse protsesside sünkroonimiseks ja lõimede abistamiseks, ilma et need toimiksid koos. Semafooride liides on määratud POSIX standardiga. See ei kuulu Pthreadsi hulka. Kuid enamik Pthreadsi toetavaid UNIX -e pakuvad isegi semafoore. Unixi-sarnastes raamistikes, näiteks Linuxis, ühendatakse semafoorid sõnumijärjekordade ja ühise mäluga protsessidevahelise suhtluse (IPC) all. Vanemad raamistiku V semafoorid ja kaasaegsed POSIX -semafoorid muutuvad kahte tüüpi semafoorideks. POSIX Semaforikõned on palju lihtsamad kui süsteemi V Semaforkõned. Kuigi süsteemi V semafoore on lihtsam hankida, eriti varasematel Unixi-sarnastel platvormidel. POSIXi semafoore kasutavaid programme on vaja ühendada Pthreadi koguga. Vaatame selles artiklis POSIXi semafoore.



Miks POSIX -semafoorid?

Niitide ümber on suur probleem, mis on võistlustingimused. See on olukord, kus kaks lõime püüavad sama teavet hankida ja muuta, muutes selle vastuoluliseks. Võistlustingimuste vältimiseks oleme semafoore kasutanud väga pikka aega.



Semafoore on saadaval kahte tüüpi:

Binaarne semafor :

Seda tuntakse ka mutex -lukuna. Sellel oleks ainult kaks võimalikku väärtust, 0 ja 1. Väärtus lähtestatakse kui 1. Seda kasutatakse tõsiste sektsioonide probleemi lahendamiseks paljude protsesside jõustamiseks.



Semaforide lugemine :

Selle suurus võib piiranguteta domeenis erineda. Seda kasutatakse selleks, et omada juurdepääsu paljudele eksemplaride ressurssidele.

Linuxi POSIX -raamistikul on integreeritud Semaphore -hoidla. Selle kasutamiseks peame:

  • Lisa semafor.h
  • Koguda koodi, ühendades -lpthread -lrt.

Peaaegu kõik POSIX Semaphore'i meetodid ja vormid on prototüüpitud või täpsustatud jaotises „Semaphore.h”. Me kasutame Semaforit, et kirjeldada üksust või objekti järgmiselt:

>>sem_t sem_name;

Siin on erinevad funktsioonid, mida me POSIX Semaforis kasutaksime.

Sem_init

Semafoori lähtestamiseks peate kasutama meetodit sem_init. Selle funktsiooni korral vastab sem initsialiseeritud semafoorobjektile. Pshared on bänner või lipp, mis määrab, kas semaforit saab jagada kahvliga () protseduuriga või mitte. Jagatud semafoore LinuxThreads praegu ei toeta. Argumendi väärtus on lähteväärtus, mille juures semafoor on fikseeritud.

>> intsem_init(sem_t*sem, intpshared, allkirjastamata intväärtus);

Sem_wait

Me kasutame semafoori hoidmiseks/lukustamiseks või ootama panemiseks sem-wait meetodit. Kui semafoor on varustatud negatiivse väärtusega, blokeeritakse kõne tsükkel automaatselt. Alati, kui mõni teine ​​teema kutsub sem_post, ärkab üks juba ummistunud protsessidest.

>> intpool_oota(sem_t*sem);

Sem_post

Semafoori väärtuse suurendamiseks kasutame meetodit sem_post. Helistamisel suurendab sem_post väärtust ja üks juba ummistunud või ootavatest protsessidest ärkab.

>> intsem_post(sem_t*sem);

Sem_getvalue

Kui soovite teada semafoori väärtusest, peate kasutama allolevat funktsiooni sem_getvalue. See saab semafoori nüüdisväärtuse ja paigutatakse sihtpunkti.

>>Int sem_getvalue(sem_t*sem, int *kutsikas);

Sem_destroy

Kui soovite semafoori hävitada, peaksite kasutama sem_destroy meetodit. Kui semafoori hääbumine jätkub, ei oota semaforis ühtegi lõime.

>>Int sem_destroy(sem_t*sem);

Installige GCC utiliit

POSIX Semaphore C koodi kompileerimiseks peab teie Linuxi süsteemi olema installitud utiliit gcc. Selleks avage oma käsuterminal ja proovige allolevat käsku.

$sudo apt-get install gcc

Kinnitage oma tegevust löömisega JA .

POSIX Semafoori rakendamine C -programmeerimisega Ubuntus

Kohe alguses peate Ubuntu 20.04 süsteemis looma uue faili laiendiga .cpp. Selleks peate navigeerima oma kodukataloogi poole ja looma uue tühja faili nimega new.cpp. Saate selle luua ka oma käsuterminali puutetundliku käsu abil.

Näete, et uus kataloog on loodud kodukataloogis.


Pärast .cpp -faili loomist avage see oma Linuxi süsteemis tekstiredaktorina ja kirjutage allolev kood sellesse faili sellisena, nagu see on. Pärast seda salvestage ja sulgege see.

Käivitage POSIX Semaphore C programm Ubuntu 20.04

Avage oma terminal Ubuntu 20.04 -s ja täitke allolev käsk gcc, millele järgneb failinimi.

$gccfailinimi.c - sügavusluuk - lrt

Moodustati 2 niiti, üks moodustatakse teise 2 sekundi pärast. Pärast poldi saamist magab esimene niit 4 sekundit. Niisiis, pärast selle helistamist teine ​​lõng otseselt ei liitu ja see ilmub 4-2 = 2 sekundit pärast helistamist. Siin on väljund:

Kui me poleks semafoori kasutanud, oleks kontekstivahetuse kohaselt võinud tulemus olla järgmine:

Järeldus

Selles juhendis on antud üksikasjalik ülevaade POSIXSemaphore kasutamisest koos C -programmeerimisega Ubuntu 20 -s. Kasutades POSIXi või Pthreadi kogu kogu teatud C -koodi ulatuses, saab POSIX Semaforit üsna hõlpsalt kasutada rasestumistingimuste vältimiseks kodeerimise ajal.