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
Inhaltsverzeichnis 1. Die Richtung davon in der F...
Inhaltsverzeichnis 1. Node erstellt HTTP-Server 2...
MySQL auf Groß-/Kleinschreibung eingestellt Windo...
Code kopieren Der Code lautet wie folgt: <html...
Im Vorstellungsgespräch sollten Sie folgende Szen...
Wenn Sie nginx als Reverse-Proxy verwenden, könne...
Heute werde ich die grundlegendsten Funktionen von...
1. Einleitung Vor ein paar Tagen bin ich bei der ...
vorgenannt Dieser Artikel ist sehr kurz~ Der Haup...
Daten initialisieren Tabelle löschen, wenn `test_...
Detaillierte Erklärung und Zusammenfassung der UR...
Vorne geschrieben Es gibt zwei Möglichkeiten, MyS...
Inhaltsverzeichnis 1. Geben Sie einen Wert ein un...
Debug-Zweig Während der normalen Entwicklung eine...
Inhaltsverzeichnis Einführung Plätzchen Was sind ...