POSIX semafory s programováním C.

Posix Semaphores With C Programming

POSIX označuje přenosné rozhraní operačního systému, což je standard IEEE, vyvinutý za účelem podpory přenositelnosti různých aplikací. POSIX je snaha vybudovat společnou standardizovanou verzi UNIX prostřednictvím spolupráce prodejců. Pokud by byly efektivní, přenesení aplikací mezi hardwarové platformy by bylo jednodušší. Společnost Hewlett-Packard integruje POSIX do svého licencovaného MPE/iX OS verze 5.0 a HP/UXX verze 10.0 (jeho UNIX).

Standard POSIX má mnohem více než deset částí, dvě jsou však snadno dostupné. POSIX.1 popisuje programovací rozhraní C (tj. Knihovnu systémových volání) pro soubory, procedury a I/O terminály. Knihovna balíčků C POSIX pro platformy POSIX je rámcem standardní knihovny C. Toto je zavedeno ve stejnou dobu jako standardní ANSI C. Aby byl POSIX kompatibilní se standardem C, bylo provedeno několik pokusů. POSIX poskytuje další funkce k těm implementovaným ve standardu C.



POSIX semafory

Semafor je datová struktura, která se často používá k synchronizaci procesů a pomáhá vláknům bez vzájemné interakce, aby fungovaly společně. Rozhraní pro semafory je určeno standardem POSIX. Není součástí Pthreads. Většina UNIXů, které podporují Pthreads, však dokonce poskytuje semafory. V unixových rámcích, jako je Linux, jsou semafory sloučeny s frontami zpráv a společnou pamětí pod službami Interprocess Communication (IPC). Starší framework S semafory a moderní POSIX semafory se stávají dvěma typy semaforů. Volání POSIX semaforu je mnohem jednodušší než volání Semaphore System V. Semafory System V je však snazší získat, zejména na dřívějších platformách podobných Unixu. Je třeba propojit programy pomocí semaforů POSIX s knihovnou Pthread. V tomto článku se podíváme na semafory POSIX.



Proč POSIX semafory?

Kolem vláken je velký problém, což jsou rasové podmínky. Jedná se o okolnost, za níž se dvě vlákna snaží získat a změnit stejné informace, čímž jsou v rozporu. Abychom se vyhnuli rasovým podmínkám, používáme semafory velmi dlouho.



Semafory jsou k dispozici ve 2 druzích:

Binární semafor :

Je také rozpoznán jako zámek mutexu. Mělo by to pouze dvě možné hodnoty, 0 a 1. Hodnota bude inicializována jako 1. Používá se k vynucení řady procesů k vyřešení závažného problému s oddíly.



Počítání semaforu :

Jeho velikost se může v neomezené doméně lišit. Používá se k získání oprávnění k přístupu k prostředkům mnoha instancí.

Rámec Linux POSIX má integrované úložiště Semaphore. Abychom ji mohli použít, musíme:

  • Přidejte semafor.h
  • Nahraďte kód propojením s -lpthread -lrt.

Téměř všechny metody a formuláře POSIX Semaphore jsou prototypovány nebo specifikovány v ‘Semaphore.h’. Semafor použijeme k popisu entity nebo objektu jako:

>>sem_t sem_name;

Zde jsou různé funkce, které bychom používali v POSIX Semaphore.

Sem_init

K inicializaci semaforu musíte použít metodu sem_init. V této funkci sem odpovídá inicializovanému objektu semaforu. Pshared je banner nebo příznak, který určuje, zda lze semafor sdílet s procedurou forked () nebo ne. Sdílené semafory nejsou v současné době složeny z LinuxThreads. Hodnota argumentu je počáteční hodnotou, na kterou je semafor pevně nastaven.

>> intsem_init(sem_t*sem, intpshared, nepodepsaný inthodnota);

Sem_wait

Budeme používat metodu sem-wait k držení/zamčení semaforu nebo k jeho vyčkávání. Pokud byl semafor opatřen zápornou hodnotou, pak bude cyklus volání automaticky blokován. Kdykoli jakékoli jiné vlákno volá sem_post, probudí se jeden z již ucpaných procesů.

>> intsem_wait(sem_t*sem);

Sem_post

Ke zvýšení hodnoty semaforu použijeme metodu sem_post. Po zavolání sem_post zvýší hodnotu a jeden z již ucpaných nebo čekajících procesů se probudí.

>> intsem_post(sem_t*sem);

Sem_getvalue

Pokud chcete vědět o hodnotě semaforu, musíte použít níže uvedenou funkci sem_getvalue. Získá současnou hodnotu semaforu a umístí se do cílového bodu s valpem.

>>Int sem_getvalue(sem_t*sem, int *štěně);

Sem_zničit

Pokud chcete semafor zničit, měli byste používat metodu sem_destroy. Pokud má zánik semaforu pokračovat, nebude v semaforu čekat žádné vlákno.

>>Int sem_destroy(sem_t*sem);

Nainstalujte si nástroj GCC

Chcete -li kompilovat kód POSIX Semaphore C, musíte mít v systému Linux nainstalován nástroj gcc. Za tímto účelem otevřete příkazový terminál a zkuste následující příkaz.

$sudo apt-get install gcc

Potvrďte svou akci klepnutím A .

Implementace POSIX Semaphore s programováním C v Ubuntu

Na úplném začátku musíte v systému Ubuntu 20.04 vytvořit nový soubor s příponou .cpp. K tomu musíte přejít do domovského adresáře a vytvořit nový prázdný soubor s názvem new.cpp. Můžete jej také vytvořit pomocí dotykového příkazu ve vašem příkazovém terminálu.

Můžete vidět, že soubor new.cpp byl vytvořen v domovském adresáři.


Po vytvoření souboru .cpp jej otevřete jako textový editor v systému Linux a do tohoto souboru zapište níže uvedený kód. Poté jej uložte a zavřete.

Spusťte program POSIX Semaphore C v Ubuntu 20.04

Otevřete svůj terminál v Ubuntu 20.04 a proveďte níže uvedený příkaz gcc následovaný názvem souboru.

$gccnázev_souboru.c –lpthread –lrt

Jsou vytvořena 2 vlákna, jedno se vytvoří po 2 sekundách druhého. Po obdržení šroubu úplně první vlákno usne na 4 sekundy. Poté, co bylo zavoláno, by se druhé vlákno nepřipojilo přímo, a to se objeví 4-2 = 2 sekundy po jeho volání. Zde je výstup:

Pokud bychom nepoužili semafor, podle přepínání kontextu by výsledek mohl vypadat takto:

Závěr

V této příručce byl uveden podrobný přehled použití POSIXSemaphore s programováním C v Ubuntu 20. Pouhým používáním knihovny POSIX nebo Pthread v určitém kódu C lze POSIX semafor snadno použít k prevenci rasových podmínek během kódování.