POSIX szemaforok C-ben

Posix Szemaforok C Ben



„Bár minden programozási nyelvnek sok könyvtára van meghatározott célokra, a C POSIX könyvtárának megvan a maga helye. Úgy lett kialakítva, hogy nagy harmonizációt teremtsen a folyamatok között, és sokat segít a programokon belüli multithreading használatában, azaz több szál létrehozásában és végrehajtásuk szinkronizálásában. Ebben a mai útmutatóban egy egyszerű illusztrációt láthat a POSIX szemaforok C nyelven történő használatáról. Az alapvető C kód példáihoz konfigurálnunk kell a fordítóját a rendszerben. De előtte frissítenünk kell a rendszert, mivel ez elengedhetetlen lépés a kód zökkenőmentes végrehajtásához. Így a mellékelt snapban megjelenő lekérdezés elengedhetetlen a Linux operációs rendszer frissítéséhez és frissítéséhez az „apt” segédprogrammal.”


Ez a folyamat körülbelül 55 Kb helyet igényelt a Linux platformon a frissítések zökkenőmentes végrehajtásához. Ha hajlandó ennyi helyet adni, érintse meg az „y” gombot a folytatáshoz. A feldolgozás néhány percen belül befejeződik.








A rendszer teljes frissítése után az „install” parancsban található apt-get segédprogrammal konfiguráljuk a C nyelv fordítóját rendszerünkben. Használja a „gcc”-t kulcsszóként, és ennyi.





sem_init()

Új szemafor jön létre, ha már van egy azonosítatlan szemafor az „s”-nél; ellenkező esetben a már meglévő szemafor el lesz vetve. Ebben a metódusban az „s” egy olyan szemafor példányt jelent, amelyet megépítettek, a megosztott pedig egy jel vagy zászló, amely jelzi, hogy a szemafor elosztható-e forked() metódussal vagy más módon. A bemeneti érték a szemafor beállított kezdőpontjaként szolgál.





Int sem_init ( sem_t * s, int megosztott, előjel nélküli int érték ) ;

Sem_wait()

A semafor zárolási művelet végrehajtásával az „s” karakterrel meghatározott szemaforon a sem_wait() metódus megtartja ezt a szemafort. A félvárás eljárást a szemafor megtartására vagy sorban állásra kell használni. Néhány korábban túlterhelt folyamat felébred, amikor egy másik folyamat meghívja a sem_post()-ot.



int sem_wait ( sem_t * s ) ;

Sem_post()

A sem post meghívásakor az érték megemelkedik, majd valamelyik korábban mentett vagy várakozó művelet elindul, azaz feloldja a már zárolt szemafort.

int sem_post ( sem_t * s ) ;

no_destroy()

Egy inicializált névtelen „s” szemafor megsemmisítésre kerül a sem delete() függvény használatával.

int sem_destroy ( sem_t * s ) ;

Példa

A szemaforok megértéséhez először létrehozunk egy C fájlt, majd hozzáadunk egy kódot. Létrehozásához használja a „touch” lekérdezést, és az új fájlt a rendszer saját mappájában találja meg.


Most meg kell nyitnia az üres C fájlt egy egyszerű szerkesztővel, hogy jó kódot generáljon benne. Eddig a „nano” szerkesztővel próbálkoztunk, amint az az alábbi képen látható.


Mindannyian tudjuk, hogy minden programozási nyelv nem működhet könyvtárak nélkül, mivel ezek a könyvtárak nagyszámú osztályt, struktúrát, függvényt és objektumot tartalmaznak, amelyeket a rendszer általános működéséhez kell használni. Tehát elindítjuk ezt a C programot néhány alapvető és kötelező könyvtár használatával a POSIX szemaforokhoz.

Ahhoz, hogy ezeket a könyvtárakat használhassuk a kódban, minden egyes könyvtárnál a „#” karaktert kell használnunk az „include” kulcsszóval. Jelenleg összesen 4 olyan könyvtárat adtunk hozzá, amelyeknek szerepelniük kell ebben a programban. Ellenkező esetben a programunk nem fog megfelelően működni. Az első „stdio.h” fejléckönyvtár általában kötelező minden C programban, mert lehetővé teszi számunkra, hogy bemeneti és kimeneti műveletek legyenek a kódban. Ezért arra használjuk, hogy zökkenőmentesen adjunk hozzá bemeneteket és kapjunk kimeneteket a kódból. A második könyvtár, amelyet itt használunk, a „pthread.h”, amely elengedhetetlen a szálprogramozás, azaz a többszálú programozás használatához.

Ezt a könyvtárat fogjuk használni szálak létrehozására egy programban. A következő és legfontosabb könyvtár ebben a kódban a „semaphore.h”. A szálak zökkenőmentes szinkronizálására használták. Végül, de nem utolsósorban, a könyvtár az „unistd.h”, amely lehetővé teszi a felhasználó által definiált különféle függvények és állandók használatát. Most deklaráltuk az „s” szemafort a szemaforkönyvtár „sem_t” beépített objektumával. Itt jön a felhasználó által definiált „T” szál függvény, visszatérési típus nélkül. Néhány beépített szemafor funkciót használt a szinkronizáláshoz. A sem_wait() függvény az „s” szemafor megtartására szolgál az „&” karakter használatával.

A tartáson belül a printf() utasítás végrehajtásra került a „sleep” függvénnyel együtt, hogy ez a program 4 másodpercig aludjon. Egy másik printf() utasítás új üzenetet jelenít meg, és a sem_post() függvény végrehajtásra kerül az „s” szemafor zárolásának feloldásához.

#include
#include
#include
#include
sem_t s;
üres * T ( üres * arg ) {
sem_wait ( & s ) ;
printf ( 'Üdvözöljük! \n ' ) ;
alvás ( 4 ) ;
printf ( 'Viszlát! \n ' ) ;
  sem_post ( & s ) ;
}



Vessünk egy pillantást ennek a C-programnak a szemaforokhoz való main() metódusára. A sem_init() függvényt itt használták fel egy új „s” szemafor létrehozására, amelyet nem terjesztettek el forked() metódussal, azaz „0”, és a kiindulópontja 1. A pthread_t objektum a pthreadból A C könyvtárát két szál létrehozására használták fel két szálobjektum, az o1 és az o2 segítségével. A printf() utasítás itt azt jelzi, hogy az első szálat a következő sorban lévő pthread_create() függvény használatával fogjuk létrehozni.

Az o1 szál objektumot NULL korlátozásokkal adtuk át ennek a függvénynek, és a paraméterek között a „T” függvényt hívtuk meg. 4 másodperces alvás után egy másik szál jött létre az o2 objektummal, és itt a pthread_join() függvényt használják a szálak main() függvénnyel történő összekapcsolására. A sem_destroy() függvény az „s” szemafor megsemmisítésére szolgál, és az összes blokkolt szál is felszabadul.

int fő ( ) {
sem_init ( & s, 0 , 1 ) ;
pthread_t o1, o2;
printf ( 'Most az első szálban... \n ' ) ;
pthread_create ( & o1,NULL,T,NULL ) ;
alvás ( 4 ) ;
printf ( 'Most egy 2. szálban... \n ' ) ;
pthread_create ( & o2,NULL,T,NULL ) ;
pthread_join ( o1,NULL ) ;
pthread_join ( o2,NULL ) ;
no_destroy ( & s ) ;
Visszatérés 0 ;
}



A C programot a „Gcc” fordítóval fordítjuk; az „-lrt” és „-lpthread” opciókat a POSIX szálfunkciók végrehajtására használják. Az „.a/.out” lekérdezés futtatásakor létrejött az első szál. Az első üzenet kinyomtatása után elalszik.


A második szál szinkronizálódott, majd 4 másodperc múlva az első szál felszabadul, a második szál pedig 4 másodpercre lezárult.


Végül a második szál is elszabadult.

Következtetés

Ennyi a POSIX Semaphores C-ben, miközben néhány fő funkcióját használja a különböző szálak szinkronizálására. Miután elolvasta ezt a cikket, egyre többet fog tudni megérteni a POSIX-ről.