C Sem_init -Funktionsverbrauch

C Sem_init -Funktionsverbrauch
Sem_init () function eignet sich für die Initialisierung eines unbenannten Semaphors. Nun stellt sich die Frage: Was ist ein Semaphor? Semaphor ist ein Konzept, das sich mit einem Prozess oder einer Threadsynchronisation befasst. Ein Semaphor ist eine Datenstruktur, mit der der Prozess synchronisiert und die Threads unterstützt wird, ohne mit den anderen Threads zu interagieren, um ihren Betrieb gemeinsam fortzusetzen. Die Art des Semaphors, das Linux unterstützt. POSIX wird als tragbare Schnittstelle des Betriebssystems verwendet. C POSIX verfügt über eine Packungsbibliothek mit Standard C. POSIX fügt den in C -Standards verwendeten Programme einige zusätzliche Funktionen hinzu.

Warum werden Semaphoren verwendet??

Während wir Threads verwenden, stoßen wir auf verschiedene bedingte Probleme, die Rassenbedingungen betreffen. Dies tritt auf, wenn zwei oder mehr Threads gleichzeitig dieselben Daten oder Informationen benötigen, was zu Konflikten führt. Um diese Art von widersprüchlicher Situation zu vermeiden, verwenden wir Semaphoren. Es gibt drei Haupttypen von Semaphoren. Einer ist ein binäres Semaphor und ein anderer ist ein Zählsemaphor.

Wir verwenden verschiedene Funktionen im Bereich von Semaphor wie Sem_wait, Sem_Post und Sem_init. Sem_init ist das Thema, das in diesem Artikel weiter berücksichtigt wird.

Sem_init

Wie wir oben diskutiert haben, verwenden wir die Semaphor -Semaphor in Threads die Sem_init -Funktion. Hier verwenden wir eine Flagge oder ein Banner, das die Freigabe von Semaphor mit Fork () -Verfahren identifiziert.

Syntax

# sem_init (sem *sem, int pshared, int value (unsigned));

Sem: Dieses Feature unterstützt das Semaphor in einem fertigen Zustand.

Pshared: Dieses Parameterargument ist in der Semaphorerklärung von grundlegender Bedeutung. Wie es den Status des neu initialisierten Semaphors bestimmt. Ob es zwischen den Prozessen oder Threads geteilt werden sollte oder nicht. Wenn der Wert ungleich Null ist, bedeutet dies, dass das Semaphor zwischen zwei oder mehr Prozessen geteilt wird. Wenn der Wert Null ist, wird das Semaphor zwischen den Threads geteilt.

Wert: Es gibt den Wert an, der dem neu erstellten Semaphor zugewiesen werden soll, das zunächst zugewiesen wird.

Implementierung von sem_init

Um Semaphoren im C -Programm auszuführen, brauchen wir einen GCC -Compiler. Aber das reicht nicht aus. "-LpThread" wird verwendet, um den Code auszuführen. 'A.C 'ist der Dateiname. Eine andere Sache ist, dass wir hier verwenden. '.Aus "mit dem Dateinamen, anstatt die Datei unabhängig zu verwenden.

Beispiel 1

Zunächst fügen wir zwei Bibliotheken mit Semaphoren und Phread hinzu, um die Verwendung von C -Paketen zu verwöhnen. Wie SEM_init werden andere Semaphoren in diesem Programm verwendet; Hier werden wir sie besprechen.

Sem_wait ()

Diese Funktion wird verwendet, um ein Semaphor zu halten oder weiter zu warten. Wenn der Wert des Semaphors negativ ist, ist die Aufruf blockiert und der Zyklus ist geschlossen. Während jeder andere Faden, wenn es aufgerufen wird, die blockierten Semaphoren geweckt werden.

Sem_post ()

SEM_POST -Methode wird verwendet, um den Semaphorwert zu erhöhen. Der Wert wird durch sem_post erhöht, wenn er aufgerufen wird.

Sem_destroy ()

Wenn wir Semaphor zerstören wollen, verwenden wir die Sem_Destroy -Methode. Konzentrieren Sie sich jetzt erneut auf den hier bereitgestellten Quellcode. Erstens wird hier die Funktion „wartet“ verwendet. Dadurch wird der Thread zuerst warten, damit andere eine Aufgabe ausführen können. Es wird eine Nachricht angezeigt, dass der Thread beim Aufrufen der Funktion eingegeben wird. Danach wird eine „Schlaf“ -Funktion 5 Sekunden lang aufgerufen.

Es werden zwei Threads nach den Hauptfunktionen erstellt, 2 Threads werden erstellt, aber der erste schläft 5 Sekunden nach dem Erwerb des Schlosses. Der zweite Thread wird also nicht eingegeben, wenn er aufgerufen wird. Es wird nach 5-2 Sekunden eingeben, wenn es aufgerufen wird.

Sem_Post funktioniert nach der Schlaffunktion; SEM_POST funktioniert und zeigt eine vollständige Statusnachricht an. Im Hauptprogramm wird das Semaphor zuerst initialisiert, und dann werden beide Threads mit Phread erstellt. Wir verwenden die Funktion pThread_join, um den Threads zu verbinden. Und am Ende werden Semaphoren zerstört.

Speichern Sie die Datei mit der Erweiterung von .C; Der Code wird kompiliert und die Ausführung erfolgt. Bei der Ausführung sehen Sie, dass die erste Nachricht angezeigt wird, und es dauert dann einige Sekunden, wie wir die Schlaffunktion mit 5 Sekunden bereitgestellt haben. Nach dieser Zeit wird die zweite Nachricht für den ersten Thread angezeigt.

Häufig wird die erste Nachricht für den zweiten Thread angezeigt.

Die zweite Nachricht braucht erneut Zeit, um fortzufahren.

Beispiel 2

Bevor wir uns zuerst dem zweiten Beispiel bewegen, müssen wir das Konzept des Problems des Schriftstellers verstehen. Nehmen wir an, dass eine Datenbank, die Sie zwischen den Prozessen teilen möchten, gleichzeitig ausgeführt werden. Einige dieser Prozesse oder Threads können nur die Datenbank lesen. Gleichzeitig möchten andere möglicherweise die Datenbank ändern. Wir diskriminieren diese beiden, indem wir den ersten als Leser und den zweiten als Schriftsteller erklären. Wenn zwei Leser auf die gemeinsam genutzten Daten zugreifen, wird dies keinen Einfluss haben.

Um das Auftreten dieser Art von Schwierigkeiten zu minimieren, müssen wir Schriftsteller beim Zugriff auf die gemeinsam genutzte Datenbank unterstützen, um darin zu schreiben. Dieses Problem wird synchronisiert und als Leser-Autor-Problem bezeichnet.

Es gibt viele Variationen in diesem Problem. Der erste befasst sich mit dem Problem, auf das kein Leser wartet, es sei denn, ein Schriftsteller verwendet gemeinsame Objekte.

Dieses Programm liefert die Lösung für das erste Leser-Writer-Problem. In diesem C -Quellcode haben wir 10 Leser und 5 Verfahren verwendet, um die Lösung zu demonstrieren. Die ersten beiden Zähler werden genommen, die als Null bezeichnet werden. Der Nichtläufer identifiziert die Anzahl des Lesers. Wenn Sie sich in Richtung der Schriftstellungsfunktion bewegen, werden hier zwei Semaphorenfunktionen verwendet, das erste ist das Warten und letzteres ist der Beitrag. Dadurch wird die Nummer des Schriftstellers angezeigt.

Nach der Autor -Funktion wird die Leserfunktion hier deklariert. Der Schriftsteller ändert die Datenbank, damit der Leser nichts eingeben oder ändern kann, was von einer Sperre erworben wurde.

# Pthread_mutex_lock (& ​​mutex);

Die Anzahl der Nichtläufer wird dann inkrementiert. Hier wird eine Überprüfung von If-Statements angewendet. Wenn der Wert 1 ist, bedeutet dies der erste Leser, damit der Schriftsteller blockiert wird. Wenn der Nichtleser 0 ist, bedeutet dies, dass dies der letzte Leser ist. Daher erlauben wir dem Schriftsteller jetzt die Änderung.

# Pthread_mutex_unlock (& ​​mutex);

Wir werden uns nach der Funktion des Lesers und der Schriftstellerin zum Hauptprogramm bewegen. Hier haben wir 10 Leser und 5 Autoren initialisiert. Die Sem_init -Funktion initialisiert das Semaphor. Für Schleifen werden hier sowohl für die Leser als auch für Autoren getrennt verwendet. PThread_create erstellt die Lese- und Schreibfunktionen. Darüber hinaus wird PThread_join den Threads verbinden. Jede für die Schleife verwendet diesen Joint 5 -mal für den Zweck des Schriftstellers und dann zehnmal für den Leserzweck.

Und am Ende wird das Semaphor nach dem Gebrauch jeweils zerstört. Kompilieren Sie den Code und führen Sie ihn dann aus. Sie werden sehen, dass zufällige Zahlen für den Leser innerhalb von 10 Arraygrößen mit Count 1 generiert werden. Und für den Schriftsteller werden 5 Zahlen geändert.

Abschluss

Der Artikel 'sem_init' ist eine Funktion, die von den Semaphoren im Multithreading -Prozess verwendet wird, um die gleichzeitig auftretenden Aufgaben zu priorisieren. Es gibt viele andere Funktionen zu Semaphoren, die auch hier diskutiert werden. Wir haben zwei elementare Beispiele erklärt, um die Verwendung von Sem_init in den Funktionen und anderen Funktionen zu nutzen.