Semafory POSIX v C

Semafory Posix V C



„Ačkoli každý programovací jazyk má mnoho knihoven pro specifické účely, knihovna POSIX jazyka C má své místo. Byl navržen tak, aby vytvořil velkou harmonizaci mezi procesy a hodně pomáhá při používání multithreadingu v rámci programů, tj. vytváření více vláken a synchronizaci jejich provádění. V této dnešní příručce uvidíte jednoduchou ilustraci použití semaforů POSIX v C. Pro základní příklady kódu C musíme v systému nakonfigurovat jeho kompilátor. Předtím však musíme aktualizovat systém, protože je to nezbytný krok pro hladké provádění kódu. Dotaz zobrazený v přiloženém snímku je tedy nutností pro aktualizaci a upgrade vašeho operačního systému Linux pomocí nástroje „apt“.


Tento proces vyžadoval přibližně 55 kb prostoru na vaší platformě Linux k hladkému provedení aktualizací. Pokud jste ochotni dát tolik prostoru, pokračujte klepnutím na „y“. Zpracování bude dokončeno za několik minut.








Po úplném upgradu systému nakonfigurujeme kompilátor jazyka C v našem systému pomocí nástroje apt-get v příkazu „install“. Použijte „gcc“ jako klíčové slovo a je to.





Sem_init()

Nový semafor by byl vytvořen, pokud již existuje neidentifikovaný semafor v „s“; jinak bude již existující semafor zahozen. V celé této metodě „s“ znamená instanci Semaforu, která byla zkonstruována, a sdílený je signál nebo vlajka, která označuje, zda lze semafor distribuovat pomocí metody forked() nebo jinak. Vstupní hodnota slouží jako nastavený počáteční bod semaforu.





Int sem_init ( nor_t * s, int sdílená, unsigned int hodnota ) ;

Sem_wait()

Provedením akce uzamčení semaforu na semaforu, který je specifikován pomocí „s“, metoda sem_wait() tento semafor zadrží. Procedura sem-wait bude použita k udržení semaforu nebo jeho ponechání stát ve frontě. Některé z dříve přetížených procesů se probudí, když nějaký jiný proces vyvolá sem_post().



int sem_čekej ( nor_t * s ) ;

no_post()

Při volání sem post se hodnota zvýší a poté se spustí jedna z dříve zálohovaných nebo čekajících operací, tj. odemkne již zamčený semafor.

int sem_post ( nor_t * s ) ;

no_destroy()

Inicializovaný bezejmenný semafor „s“ je zničen pomocí funkce sem zničit().

int sem_destroy ( nor_t * s ) ;

Příklad

Abychom porozuměli semaforům, nejprve vytvoříme soubor C a poté do něj přidáme kód. Chcete-li jej vytvořit, použijte „dotykový“ dotaz a nový soubor najdete v domovské složce vašeho systému.


Nyní musíte otevřít prázdný soubor C pomocí nějakého jednoduchého editoru, abyste v něm vygenerovali dobrý kód. Zatím jsme zkoušeli editor „nano“, jak je znázorněno na obrázku níže.


Jak všichni víme, všechny programovací jazyky nemohou fungovat bez knihoven, protože tyto knihovny obsahují velké množství tříd, struktur, funkcí a objektů, které lze využít pro celkovou práci systému. Takže začínáme tento C program s použitím některých základních a nezbytných knihoven pro POSIX Semafory.

Pro použití těchto knihoven v kódu musíme pro každou knihovnu použít znak „#“ s klíčovým slovem „include“. Právě jsme přidali celkem 4 knihovny, které v tomto programu musíte mít. Jinak náš program nebude fungovat správně. První knihovna záhlaví „stdio.h“ je obvykle nutností v každém programu C, protože nám umožňuje mít v kódu vstupní a výstupní operace. Proto jej používáme k hladkému přidávání vstupů a získávání výstupů z kódu. Druhá knihovna, kterou zde používáme, je „pthread.h“, která je nezbytná pro použití programování vláken, tj. multithreading.

Tuto knihovnu budeme používat k vytváření vláken v programu. Další a nejdůležitější knihovnou v tomto kódu je „semafor.h“. Byl použit k hladké synchronizaci vláken. V neposlední řadě je to knihovna „unistd.h“, která nám umožňuje používat uživatelsky definované různé funkce a konstanty. Nyní jsme deklarovali semafor „s“ pomocí vestavěného objektu „sem_t“ knihovny semaforů. Zde přichází uživatelsky definovaná funkce vlákna „T“ bez návratového typu. K provádění synchronizace využívá některé vestavěné funkce semaforu. Funkce sem_wait() je zde pro udržení semaforu „s“ pomocí znaku „&“.

Během pozastavení byl proveden příkaz printf() spolu s funkcí „sleep“, aby se tento program na 4 sekundy uspal. Další příkaz printf() zobrazí novou zprávu a spustí se funkce sem_post() k uvolnění zámku na semaforu „s“.

#include
#include
#include
#include
ani_t s;
prázdnota * T ( prázdnota * arg ) {
sem_čekej ( & s ) ;
printf ( 'Vítejte! \n ' ) ;
spát ( 4 ) ;
printf ( 'Sbohem! \n ' ) ;
sem_post ( & s ) ;
}



Podívejme se dobře na metodu main() tohoto programu C pro semafory. Funkce sem_init() zde byla použita k vytvoření nového semaforu „s“, který nebyl distribuován pomocí metody forked(), tj. „0“, a jeho počáteční bod je nastaven na 1. Objekt pthread_t z pthread knihovna C byla využita k vytvoření dvou vláken pomocí dvou objektů vláken, o1 a o2. Příkaz printf() je zde proto, aby ukázal, že vytvoříme první vlákno pomocí funkce pthread_create() na dalším řádku.

Této funkci jsme předali objekt vlákna o1 s omezením NULL a voláním funkce „T“ předáním v parametrech. Po 4 sekundách spánku se vytvořilo další vlákno s objektem o2 a funkce pthread_join() se zde používá ke spojení vláken pomocí funkce main(). Funkce sem_destroy() je zde, aby zničila semafor „s“ a všechna zablokovaná vlákna budou také uvolněna.

int main ( ) {
  sem_init ( & s, 0 , 1 ) ;
pthread_t o1, o2;
printf ( 'Teď v prvním vlákně... \n ' ) ;
pthread_create ( & o1,NULL,T,NULL ) ;
spát ( 4 ) ;
printf ( 'Teď ve 2. vlákně... \n ' ) ;
pthread_create ( & o2,NULL,T,NULL ) ;
pthread_join ( o1,NULL ) ;
pthread_join ( o2, NULL ) ;
no_destroy ( & s ) ;
vrátit se 0 ;
}



Kompilujeme program C pomocí kompilátoru „Gcc“; volby „-lrt“ a „-lpthread“ se používají pro provádění funkcí vláken POSIX. Při spuštění dotazu „.a/.out“ se vytvořilo první vlákno. Po vytištění první zprávy přejde do režimu spánku.


Druhé vlákno bylo synchronizováno a po 4 sekundách bylo první vlákno uvolněno a druhé vlákno bylo na 4 sekundy uzamčeno.


Nakonec se uvolnilo i druhé vlákno.

Závěr

To je vše o semaforech POSIX v C a zároveň využívají některé z jeho hlavních funkcí k synchronizaci různých vláken. Poté, co si projdete tento článek, budete schopni rozumět POSIX stále více.