Heim >Betrieb und Instandhaltung >Betrieb und Wartung von Linux >Was ist der Unterschied zwischen Bedingungsvariablen und Semaphoren unter Linux?

Was ist der Unterschied zwischen Bedingungsvariablen und Semaphoren unter Linux?

青灯夜游
青灯夜游Original
2022-05-11 19:18:346048Durchsuche

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.

Was ist der Unterschied zwischen Bedingungsvariablen und Semaphoren unter Linux?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn