Zusammenfassung der Wissenspunkte zur Synchronisierung und zum gegenseitigen Ausschluss zwischen Linux-Threads

Zusammenfassung der Wissenspunkte zur Synchronisierung und zum gegenseitigen Ausschluss zwischen Linux-Threads

Wenn Threads gleichzeitig ausgeführt werden, müssen wir einen sicheren Zugriff auf kritische Ressourcen gewährleisten, um zu verhindern, dass Threads um Ressourcen konkurrieren und Datenmehrdeutigkeiten verursachen.

Thread-Synchronisierung: Bedingungsvariablen

Warum Bedingungsvariablen verwenden?

Zur zeitlichen Steuerbarkeit kritischer Ressourcen werden, wenn die Bedingungen erfüllt sind, andere Threads, die darauf warten, kritische Ressourcen zu betreiben, ähnlich einem Signal benachrichtigt. Szenario: Warteschlange für die T-DAY-Ausstellung/Produzenten-Konsumenten-Modell

Was sind Bedingungsvariablen?

Es handelt sich um einen Synchronisierungsmechanismus. Ein Thread wird verwendet, um diese Variable zu ändern, damit die Bedingungen für die weitere Ausführung anderer Threads erfüllt sind, und andere Threads erhalten Signale, dass sich die Bedingungen geändert haben.

Bedingte Variablenoperationen?

Initialisierung und Zerstörung

pthread_cond_wait

Wenn die Bedingung nicht erfüllt ist, wird die Sperre aufgehoben und das Warten blockiert. Diese Funktion ist eine atomare Operation: 1. Setzen Sie den Thread in die Bedingungswarteschlange 2. Lösen Sie die Sperre

Wenn die Bedingung erfüllt ist, wird der Thread aktiviert und gesperrt.

pthread_cond_signal Eins-zu-Eins-Wakeup

Einen Thread in der Warteschlange aktivieren

pthread_cond_broadcast Broadcast-Aktivierung

Wecken Sie alle Threads in der Warteschlange auf

Warum erfordern Warten und Entsperren atomare Operationen/Warum verwenden Bedingungsvariablen Mutexe?

Denn die Sperre in pthread_cond_wait dient dazu, die Bedingungsvariable zu schützen und ein Verpassen des Signals zu verhindern. Wenn das Warten auf die Entsperrung keine atomare Operation ist, wird beispielsweise zuerst Thread A entsperrt und die CPU-Zeitscheibe wechselt zu Thread B. Thread B sperrt und sendet das Bedingungsvariablensignal und wechselt dann zu Thread A. Thread A verpasst das Signal, bevor er Zeit zum Warten hat, und kann für immer blockiert sein. Daher müssen Warten und Entsperren atomare Operationen sein.

Warum benötigen wir eine While-Schleife, um festzustellen, ob eine kritische Ressource vorhanden ist?

In einer Eins-zu-viele-Situation sendet der Produzent ein Signal, der wartende Thread wird aufgeweckt und gesperrt, aber nur ein Thread kann sperren, und die anderen Threads werden blockiert, während sie auf die Sperre warten. Wenn dieser Thread die kritischen Ressourcen verbraucht, ist es für andere Threads unvernünftig, weiterzumachen, ohne eine Entscheidung zu treffen.

Soll das Signal zuerst oder später freigeschaltet werden?

Wenn die Sperre zuerst entsperrt wird und die Sperre von einem Thread erhalten wird, der nicht blockiert ist und wartet, und dann die kritische Ressource verwendet wird, ist das Signal nach der Entsperrung bedeutungslos, was ein falsches Aufwecken darstellt.

Zuerst wird Singal aktiviert, und dann kann der aktivierte Thread um die Sperre konkurrieren. Unter Linux gibt es zwei Warteschlangen, eine ist cond_wait und die andere ist mutex_lock. Singal überträgt den Thread nur von cond_wait zu mutex_lock und kehrt nicht in den Benutzerbereich zurück, was die Effizienz verbessern kann.

Gegenseitiger Thread-Ausschluss: Mutex-Sperre

Warum Mutexe verwenden?

Greifen Sie nur auf kritische Ressourcen gleichzeitig zu und schützen Sie sie so vor Änderungen. Szenario: Schwarzhändler schnappen sich Tickets

Was ist ein Mutex?

Es handelt sich um einen 0/1-Zähler. 1 bedeutet, dass Ressourcen für den Betrieb verfügbar sind, 0 bedeutet, dass keine Ressourcen für den Betrieb verfügbar sind.

Mutex-Sperrvorgang?

Initialisierung und Zerstörung

Sperren --- Wenn der Zähler 1 ist, setzen Sie ihn auf 0 und führen Sie den erforderlichen Vorgang aus. Wenn der Zähler 0 ist, blockieren Sie und warten Sie, bis der Zähler 1 wird.

Entsperren --- Setzen Sie den Zähler auf 1

Dies sind alle relevanten Wissenspunkte, die dieses Mal vorgestellt wurden. Vielen Dank für Ihr Lernen und Ihre Unterstützung für 123WORDPRESS.COM.

<<:  Sind Sie immer noch Select *?

>>:  Gegenfall für die Vue-Implementierung

Artikel empfehlen

Detaillierte Erklärung der JavaScript-Funktion dieses Zeigeproblems

Inhaltsverzeichnis 1. Die Richtung davon in der F...

Node.js+Postman zur Simulation der HTTP-Server- und Client-Interaktion

Inhaltsverzeichnis 1. Node erstellt HTTP-Server 2...

So stellen Sie MySQL so ein, dass die Groß-/Kleinschreibung nicht beachtet wird

MySQL auf Groß-/Kleinschreibung eingestellt Windo...

HTML-Formular und die Verwendung interner Formular-Tags

Code kopieren Der Code lautet wie folgt: <html...

Was tun, wenn der Auto-Increment-Primärschlüssel in MySQL aufgebraucht ist?

Im Vorstellungsgespräch sollten Sie folgende Szen...

Tutorial: Nginx-Reverse-Proxy-Konfiguration zum Entfernen von Präfixen

Wenn Sie nginx als Reverse-Proxy verwenden, könne...

Lösen Sie das Problem, dass await in forEach nicht funktioniert

1. Einleitung Vor ein paar Tagen bin ich bei der ...

So konvertieren Sie MySQL horizontal in vertikal und vertikal in horizontal

Daten initialisieren Tabelle löschen, wenn `test_...

Detaillierte Erklärung und Zusammenfassung der URL zur Datenbankverbindung

Detaillierte Erklärung und Zusammenfassung der UR...

So aktualisieren Sie MySQL 5.6 auf 5.7 unter Windows

Vorne geschrieben Es gibt zwei Möglichkeiten, MyS...

Allgemeine Front-End-JavaScript-Methodenkapselung

Inhaltsverzeichnis 1. Geben Sie einen Wert ein un...

Detaillierte Erklärung des JS-Browserspeichers

Inhaltsverzeichnis Einführung Plätzchen Was sind ...