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

So zeigen Sie das MySQL-Binlog (Binärprotokoll) an

Wenn Sie beispielsweise eine neue Tabelle erstell...

Zusammenfassung der Wissenspunkte zu Null in der MySQL-Datenbank

In der MySQL-Datenbank ist Null eine häufige Situ...

Bootstrap3.0-Studiennotizentabelle bezogen auf

In diesem Artikel werden hauptsächlich Tabellen e...

Einfache Implementierung von HTML zum Erstellen eines persönlichen Lebenslaufs

Lebenslauf-Code: XML/HTML-CodeInhalt in die Zwisc...

Tutorial zur Verwendung von Hyperlink-Tags in XHTML

Hyperlink, auch „Link“ genannt. Man kann sagen, d...

Das WeChat-Applet zeichnet die Bewegungsbahn des Benutzers auf

Inhaltsverzeichnis Konfiguration hinzufügen JSON-...

Detaillierte Erklärung zum Anpassen des Linux-Befehlsverlaufs

Der Befehl „Bash History“ im Linux-System hilft d...

Docker stellt Mysql, .Net6, Sqlserver und andere Container bereit

Inhaltsverzeichnis Installieren Sie Docker unter ...

Nodejs implementiert Intranet-Penetrationsdienst

Inhaltsverzeichnis 1. Proxy im LAN 2. Intranet-Pe...