Semafory POSIX w C

Semafory Posix W C



„Chociaż każdy język programowania ma wiele bibliotek do określonych celów, biblioteka POSIX języka C ma swoje miejsce. Został zaprojektowany, aby stworzyć świetną harmonizację między procesami i bardzo pomaga w korzystaniu z wielowątkowości w programach, tj. tworzeniu wielu wątków i synchronizowaniu ich wykonywania. W dzisiejszym przewodniku zobaczysz prostą ilustrację użycia semaforów POSIX w C. Dla podstawowych przykładów kodu C, musimy skonfigurować jego kompilator w systemie. Ale zanim to nastąpi, musimy zaktualizować system, ponieważ jest to niezbędny krok do płynnego wykonania kodu. Dlatego zapytanie wyświetlane w załączonym snapie jest niezbędne do aktualizacji i aktualizacji systemu operacyjnego Linux za pomocą narzędzia „apt”.


Ten proces wymagał około 55 KB miejsca na platformie Linux, aby bezproblemowo przeprowadzić aktualizacje. Jeśli chcesz dać tyle miejsca, dotknij „y”, aby kontynuować. Przetwarzanie zakończy się za kilka minut.








Po pełnej aktualizacji systemu skonfigurujemy kompilator języka C w naszym systemie za pomocą narzędzia apt-get w poleceniu „install”. Użyj „gcc” jako słowa kluczowego i to wszystko.





sem_init()

Świeży semafor zostałby utworzony, gdy w „s” znajduje się już niezidentyfikowany semafor; w przeciwnym razie ten już istniejący semafor zostanie odrzucony. W całej tej metodzie „s” oznacza instancję Semaphore, która została skonstruowana, a udostępniona jest sygnałem lub proporcem wskazującym, czy semafor może być dystrybuowany za pomocą metody forked() lub w inny sposób. Wartość wejściowa służy jako punkt początkowy ustawienia semafora.





Int sem_init ( nor_t * s, int współdzielone, unsigned int wartość ) ;

Sem_czekaj()

Wykonując akcję blokady semafora na semaforze określonym przez „s”, metoda sem_wait() przechowuje ten semafor. Procedura sem-wait zostanie użyta do zachowania semafora lub pozostawienia go w linii. Niektóre z wcześniej przeciążonych procesów budzą się, gdy inny proces wywołuje sem_post().



int sem_czekaj ( nor_t * s ) ;

nie postuj()

Po wywołaniu sem post wartość jest zwiększana, a następnie uruchamia się jedna z wcześniej utworzonych lub oczekujących operacji, tj. Odblokowuje już zablokowany semafor.

int sem_post ( nor_t * s ) ;

no_destroy()

Zainicjalizowany bezimienny semafor „s” jest niszczony przy użyciu funkcji sem destroy().

int sem_destroy ( nor_t * s ) ;

Przykład

Aby zrozumieć semafory, najpierw utworzymy plik C, a następnie dodamy do niego kod. Aby go utworzyć, użyj zapytania „touch”, a nowy plik znajdziesz w folderze domowym swojego systemu.


Teraz musisz otworzyć pusty plik C za pomocą prostego edytora, aby wygenerować w nim dobry kod. Do tej pory próbowaliśmy edytora „nano”, jak pokazano na poniższym przystawce.


Jak wszyscy wiemy, wszystkie języki programowania nie mogą działać bez bibliotek, ponieważ biblioteki te zawierają dużą liczbę klas, struktur, funkcji i obiektów, które można wykorzystać do ogólnego działania systemu. Więc zaczynamy ten program w C z użyciem kilku podstawowych i niezbędnych bibliotek dla Semaforów POSIX.

Aby użyć tych bibliotek w kodzie, musimy użyć znaku „#” ze słowem kluczowym „include” dla każdej biblioteki. W tej chwili dodaliśmy łącznie 4 biblioteki, które muszą mieć w tym programie. W przeciwnym razie nasz program nie będzie działał poprawnie. Pierwsza biblioteka nagłówkowa „stdio.h” jest zwykle niezbędna w każdym programie C, ponieważ pozwala nam na wykonywanie operacji wejścia i wyjścia w kodzie. Dlatego używamy go do płynnego dodawania danych wejściowych i uzyskiwania danych wyjściowych z kodu. Drugą biblioteką, której tutaj używamy, jest „pthread.h”, która jest niezbędna do korzystania z programowania wątków, tj. wielowątkowości.

Będziemy używać tej biblioteki do tworzenia wątków w programie. Kolejną i najważniejszą biblioteką w tym kodzie jest „semaphore.h”. Został wykorzystany do płynnej synchronizacji wątków. Wreszcie biblioteka to „unistd.h”, która umożliwia nam korzystanie z różnych funkcji i stałych zdefiniowanych przez użytkownika. Teraz zadeklarowaliśmy semafor „s” za pomocą wbudowanego obiektu „sem_t” biblioteki semaforów. Tutaj pojawia się zdefiniowana przez użytkownika funkcja wątku „T” bez typu zwracanego. Wykorzystuje niektóre wbudowane funkcje semaforów do wykonywania synchronizacji. Funkcja sem_wait() służy do przechowywania semafora „s” za pomocą znaku „&”.

Wewnątrz blokady, instrukcja printf() została wykonana wraz z funkcją „sleep”, aby uśpić ten program na 4 sekundy. Kolejna instrukcja printf() wyświetla nowy komunikat, a funkcja sem_post() zostaje wykonana, aby zwolnić blokadę semafora „s”.

#włącz
#include
#zawiera
#include
ani_t s;
próżnia * T ( próżnia * argumentować ) {
sem_czekaj ( & s ) ;
printf ( 'Powitanie! \n ' ) ;
spać ( 4 ) ;
printf ( 'Do widzenia! \n ' ) ;
sem_post ( & s ) ;
}



Rzućmy okiem na metodę main() tego programu w C dla semaforów. Funkcja sem_init() została tutaj wykorzystana do stworzenia nowego semafora „s”, który nie został rozprowadzony za pomocą metody forked(), tj. „0”, a jego punkt początkowy jest ustawiony na 1. Obiekt pthread_t z pthread Biblioteka C została wykorzystana do stworzenia dwóch wątków przy użyciu dwóch obiektów wątków, o1 i o2. Instrukcja printf() jest tutaj, aby pokazać, że zamierzamy utworzyć pierwszy wątek za pomocą funkcji pthread_create() w następnym wierszu.

Przekazywaliśmy obiekt wątku o1 do tej funkcji z ograniczeniami NULL i wywołaliśmy funkcję „T” przekazując ją w parametrach. Po 4 sekundach snu utworzono kolejny wątek z obiektem o2, a funkcja pthread_join() jest tutaj używana do łączenia wątków za pomocą funkcji main(). Funkcja sem_destroy() służy do niszczenia semafora „s”, a wszystkie zablokowane wątki również zostaną zwolnione.

int main ( ) {
sem_init ( & s, 0 , 1 ) ;
pthread_to1, o2;
printf ( 'Teraz w 1. wątku... \n ' ) ;
pthread_create ( & o1,ZEROWY,T,ZEROWY ) ;
spać ( 4 ) ;
printf ( 'Teraz w drugim wątku... \n ' ) ;
pthread_create ( & o2,ZEROWY,T,ZEROWY ) ;
pthread_join ( o1,ZEROWY ) ;
pthread_join ( o2,ZEROWY ) ;
no_destroy ( & s ) ;
zwrócić 0 ;
}



Kompilujemy program w C za pomocą kompilatora „Gcc”; opcje „-lrt” i „-lpthread” są wykorzystywane do wykonywania funkcji wątków POSIX. Po uruchomieniu zapytania „.a/.out” został utworzony pierwszy wątek. Usypia się po wydrukowaniu pierwszej wiadomości.


Drugi wątek został zsynchronizowany, a po 4 sekundach pierwszy wątek został zwolniony, a drugi wątek został zablokowany na 4 sekundy.


W końcu ukazał się również drugi wątek.

Wniosek

To tyle o semaforach POSIX w C, wykorzystując niektóre z jego głównych funkcji do synchronizacji różnych wątków. Po przejrzeniu tego artykułu będziesz w stanie coraz lepiej rozumieć POSIX.