Unterschiede: 1. Die Verwendung von Bedingungsvariablen kann alle Kellner auf einmal aufwecken, Semaphoren jedoch nicht. 2. Semaphoren haben immer einen Wert (Zustand), während Bedingungsvariablen keinen Wert haben und es keinen Ort gibt, an dem die Nummer aufgezeichnet werden kann Es gibt keinen Ort, an dem die Anzahl der Warterückgaben aufgezeichnet werden kann. Der Zweck des Semaphors besteht darin, zwischen Prozessen zu synchronisieren, und der Zweck der Bedingungsvariablen besteht darin, zwischen Threads zu synchronisieren.
Die Betriebsumgebung dieses Tutorials: Linux5.9.8-System, Dell G3-Computer.
Bedingungsvariable
Bedingungsvariable (Bedingung) ist eine gängige Methode zur Implementierung der „Warten--->Wake-Up“-Logik in Multithread-Programmen und ein Mechanismus zur Synchronisierung zwischen Prozessen. Bedingungsvariablen werden verwendet, um einen Thread zu blockieren, bis die Bedingung erfüllt ist und ausgelöst wird. Normalerweise werden Bedingungsvariablen und Mutexe gleichzeitig verwendet.
Allgemeine Bedingungsvariablen haben zwei Zustände:
(1) Ein/mehrere Threads bleiben hängen, während sie auf „die Bedingungsvariable ist etabliert“ warten.
(2) Ein anderer Thread benachrichtigt, „wenn die Bedingungsvariable etabliert ist“. Threads.
Verwendung von Bedingungsvariablen:
#include <pthread.h> struct msg { struct msg *m_next; /* ... more stuff here ... */ }; struct msg *workq; pthread_cond_t qready = PTHREAD_COND_INITIALIZER; pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; void process_msg(void) { struct msg *mp; for (;;) { pthread_mutex_lock(&qlock); while (workq == NULL) pthread_cond_wait(&qready, &qlock); mp = workq; workq = mp->m_next; pthread_mutex_unlock(&qlock); /* now process the message mp */ } } void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_mutex_unlock(&qlock); pthread_cond_signal(&qready); }
Natürlich können Sie beim Auslösen von Bedingungsvariablen auch den folgenden Code verwenden. Beide Methoden haben ihre eigenen Vor- und Nachteile.
void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_cond_signal(&qready); pthread_mutex_unlock(&qlock); }
Semaphore
Semaphore ist eine besondere Art Der Variablenzugriff ist atomar.
Nur zwei Operationen sind darauf erlaubt:
(1) Auf den Semaphor warten
Wenn der Semaphorwert 0 ist, wartet das Programm; wenn der Semaphorwert größer als 0 ist, wird der Semaphor um 1 dekrementiert und das Programm läuft weiter.
(2) Senden Sie das Semaphor.
Fügen Sie 1 zum Semaphorwert hinzu.
Hinweis: Linux bietet eine Reihe von Semaphor-APIs, die in der Header-Datei sys/sem.h deklariert sind.
linux Der Unterschied zwischen Bedingungsvariablen und Semaphoren:
(1) Die Verwendung von Bedingungsvariablen kann alle Kellner auf einmal wecken, aber dieses Semaphor verfügt nicht über diese Funktion, was der größte Unterschied zu sein scheint.
(2) Das Semaphor hat immer einen Wert (Status), die Bedingungsvariable jedoch nicht. Es gibt keinen Ort, um aufzuzeichnen, wie oft es aufgeweckt wurde (ein Signal sendet), und es gibt keinen Ort, um aufzuzeichnen, wie schon oft wurde es aufgeweckt (warte, kehrt zurück). Aus Implementierungssicht kann ein Semaphor mithilfe von Mutex + Zähler + Bedingungsvariable implementiert werden. Da das Semaphor einen Status hat, kann das Semaphor spezielle Funktionen haben, wenn Sie eine präzise Synchronisierung wünschen. Semaphore können das Problem des verlorenen Aufweckens in Bedingungsvariablen lösen.
(3) Der Zweck von Semaphoren besteht darin, zwischen Prozessen zu synchronisieren, und der Zweck von Mutexes und Bedingungsvariablen besteht darin, zwischen Threads zu synchronisieren. Semaphore können jedoch auch zwischen Threads verwendet werden, und Mutexe und Bedingungsvariablen können auch zwischen Prozessen verwendet werden. Entscheidungen sollten auf der Grundlage tatsächlicher Umstände getroffen werden. Das nützlichste Szenario für Semaphoren besteht darin, die Menge der verfügbaren Ressourcen anzuzeigen.
Ein klassischer Satz:
Ein Mutex ist ein Sonderfall eines Semaphors. Das Wesentliche eines Mutex ist eine Sperre.
Verwandte Empfehlungen: „Linux-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Bedingungsvariablen und Semaphoren unter Linux?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!