POSIX-Semaphoren in C

Posix Semaphoren In C



„Obwohl jede Programmiersprache viele Bibliotheken für bestimmte Zwecke hat, hat die POSIX-Bibliothek von C ihren Platz. Es wurde entwickelt, um eine große Harmonisierung zwischen den Prozessen zu schaffen und hilft sehr bei der Verwendung von Multithreading innerhalb der Programme, d.h. beim Erstellen mehrerer Threads und Synchronisieren ihrer Ausführung. In diesem heutigen Leitfaden sehen Sie eine einfache Veranschaulichung der Verwendung von POSIX-Semaphoren in C. Für die grundlegenden C-Codebeispiele müssen wir den Compiler im System konfigurieren. Aber vorher müssen wir das System aktualisieren, da dies ein unerlässlicher Schritt für die reibungslose Ausführung von Code ist. Daher ist die im beigefügten Snapshot angezeigte Abfrage ein Muss, um Ihr Linux-Betriebssystem mit dem Dienstprogramm „apt“ zu aktualisieren und zu aktualisieren.“


Dieser Vorgang erforderte ungefähr 55 KB Speicherplatz auf Ihrer Linux-Plattform, um die Aktualisierungen reibungslos durchzuführen. Wenn Sie bereit sind, so viel Platz zu geben, tippen Sie auf „y“, um fortzufahren. Die Verarbeitung wird in einigen Minuten abgeschlossen sein.








Nachdem das System vollständig aktualisiert wurde, werden wir den Compiler der Sprache C in unserem System mit dem Dienstprogramm apt-get im Befehl „install“ konfigurieren. Verwenden Sie „gcc“ als Schlüsselwort, und das war’s.





sem_init()

Eine neue Semaphore würde erstellt werden, wenn es bereits eine nicht identifizierte Semaphore bei „s“ gibt; andernfalls wird diese bereits vorhandene Semaphore verworfen. In dieser Methode steht „s“ für eine Semaphor-Instanz, die konstruiert wurde, und „shared“ ist ein Signal oder Wimpel, das angibt, ob das Semaphor mit einer forked()-Methode oder auf andere Weise verteilt werden kann. Der Eingabewert dient als gesetzter Anfangspunkt der Semaphore.





Int sem_init ( nor_t * s, int geteilt, vorzeichenloser int-Wert ) ;

Sem_wait()

Durch Ausführen einer Semaphor-Sperraktion für das durch „s“ angegebene Semaphor hält die Methode sem_wait() dieses Semaphor. Die Sem-Wait-Prozedur wird verwendet, um eine Semaphore beizubehalten oder in der Schlange stehen zu lassen. Einige der zuvor überladenen Prozesse erwachen, wenn ein anderer Prozess sem_post() aufruft.



int sem_wait ( nor_t * s ) ;

keine Post()

Wenn sem post aufgerufen wird, wird der Wert erhöht, und dann beginnt eine der zuvor gesicherten oder wartenden Operationen zu laufen, d. h. entsperrt die bereits gesperrte Semaphore.

int sem_post ( nor_t * s ) ;

no_destroy()

Ein initialisiertes namenloses Semaphor „s“ wird mit der Funktion sem destroy() zerstört.

int sem_destroy ( nor_t * s ) ;

Beispiel

Um die Semaphore zu verstehen, erstellen wir zuerst eine C-Datei und fügen ihr dann einen Code hinzu. Um eine zu erstellen, verwenden Sie die „Touch“-Abfrage, und Sie finden die neue Datei im Home-Ordner Ihres Systems.


Jetzt müssen Sie Ihre leere C-Datei mit einem einfachen Editor öffnen, um darin guten Code zu generieren. Wir haben bisher den „nano“-Editor ausprobiert, wie im Schnappschuss unten gezeigt.


Wie wir alle wissen, können alle Programmiersprachen nicht ohne Bibliotheken arbeiten, da diese Bibliotheken eine große Anzahl von Klassen, Strukturen, Funktionen und Objekten enthalten, die für das Funktionieren des Gesamtsystems verwendet werden können. Also beginnen wir dieses C-Programm mit der Verwendung einiger grundlegender und unverzichtbarer Bibliotheken für die POSIX-Semaphoren.

Um diese Bibliotheken im Code zu verwenden, müssen wir für jede Bibliothek das Zeichen „#“ mit dem Schlüsselwort „include“ verwenden. Im Moment haben wir insgesamt 4 Bibliotheken hinzugefügt, die in diesem Programm unbedingt enthalten sein müssen. Andernfalls wird unser Programm nicht richtig funktionieren. Die erste Header-Bibliothek „stdio.h“ ist normalerweise ein Muss in jedem C-Programm, da sie uns ermöglicht, Ein- und Ausgabeoperationen im Code zu haben. Daher verwenden wir es, um Eingaben reibungslos hinzuzufügen und Ausgaben aus dem Code zu erhalten. Die zweite Bibliothek, die wir hier verwenden, ist die „pthread.h“, die für die Verwendung von Thread-Programmierung, also Multithreading, ein Muss ist.

Wir werden diese Bibliothek verwenden, um Threads in einem Programm zu erstellen. Die nächste und wichtigste Bibliothek in diesem Code ist die „semaphore.h“. Es wurde verwendet, um die Threads reibungslos zu synchronisieren. Zu guter Letzt ist die Bibliothek „unistd.h“, die es uns ermöglicht, benutzerdefinierte verschiedene Funktionen und Konstanten zu verwenden. Jetzt haben wir das „s“-Semaphor mit dem eingebauten Objekt „sem_t“ der Semaphor-Bibliothek deklariert. Hier kommt die benutzerdefinierte Thread-Funktion „T“ ohne Rückgabetyp. Es hat einige eingebaute Semaphor-Funktionen verwendet, um die Synchronisation durchzuführen. Die Funktion sem_wait() dient dazu, das Semaphor „s“ mit dem Zeichen „&“ zu halten.

Innerhalb des Holds wurde die printf()-Anweisung zusammen mit der „sleep“-Funktion ausgeführt, um dieses Programm für 4 Sekunden in den Ruhezustand zu versetzen. Eine weitere printf()-Anweisung zeigt eine neue Nachricht an, und die Funktion sem_post() wird ausgeführt, um die Sperre für die Semaphore „s“ freizugeben.

#include
#include
#include
#include
weder_t s;
Leere * T ( Leere * Arg ) {
sem_wait ( & s ) ;
Druckf ( 'Herzlich willkommen! \n ' ) ;
schlafen ( 4 ) ;
Druckf ( 'Wiedersehen! \n ' ) ;
sem_post ( & s ) ;
}



Schauen wir uns die main()-Methode dieses C-Programms für Semaphoren genauer an. Die Funktion sem_init() wurde hier verwendet, um ein neues Semaphor „s“ zu erstellen, das nicht mit einer forked()-Methode verteilt wurde, d. h. „0“, und dessen Startpunkt auf 1 gesetzt ist. Das pthread_t-Objekt aus dem pthread Die Bibliothek von C wurde verwendet, um zwei Threads mit zwei Thread-Objekten, o1 und o2, zu erstellen. Die printf()-Anweisung zeigt an, dass wir den ersten Thread mit der pthread_create()-Funktion in der nächsten Zeile erstellen werden.

Wir haben das o1-Thread-Objekt mit NULL-Einschränkungen an diese Funktion übergeben und die Funktion „T“ aufgerufen, indem wir es in den Parametern übergeben haben. Nach einer Pause von 4 Sekunden wurde ein weiterer Thread mit dem Objekt o2 erstellt, und die Funktion pthread_join() wird hier verwendet, um die Threads mit einer main()-Funktion zu verbinden. Die Funktion sem_destroy() dient dazu, das Semaphor „s“ zu zerstören, und alle blockierten Threads werden ebenfalls freigegeben.

int Haupt ( ) {
sem_init ( & s, 0 , 1 ) ;
pthread_t o1, o2;
Druckf ( 'In einem 1. Thread jetzt ... \n ' ) ;
pthread_create ( & o1,NULL,T,NULL ) ;
schlafen ( 4 ) ;
Druckf ( 'In einem 2. Thread jetzt ... \n ' ) ;
pthread_create ( & o2,NULL,T,NULL ) ;
pthread_join ( o1,NULL ) ;
pthread_join ( o2,NULL ) ;
nein_zerstören ( & s ) ;
Rückkehr 0 ;
}



Wir kompilieren das C-Programm mit dem „Gcc“-Compiler; die Optionen „-lrt“ und „-lpthread“ werden zum Ausführen der POSIX-Thread-Funktionen verwendet. Beim Ausführen der „.a/.out“-Abfrage wurde der erste Thread erstellt. Nach dem Drucken der ersten Nachricht geht es in den Ruhezustand.


Der zweite Thread wurde synchronisiert und nach 4 Sekunden wurde der erste Thread freigegeben und der zweite Thread für 4 Sekunden gesperrt.


Am Ende wurde auch der zweite Thread freigegeben.

Fazit

Das war es mit den POSIX-Semaphoren in C, während einige ihrer Hauptfunktionen verwendet werden, um verschiedene Threads zu synchronisieren. Nachdem Sie diesen Artikel durchgearbeitet haben, werden Sie POSIX immer besser verstehen können.