Frage: Wir haben folgendes Problem: Erstellen Sie einen untergeordneten Prozess in einem Multithread-Programm und lassen Sie 1. Erster VersuchCode: #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #einschließen <sys/wait.h> pthread_mutex_t Mutex; void*Spaß(void*Arg) { pthread_mutex_lock(&mutex); printf("Spaß get lock\n"); Schlaf (3); pthread_mutex_unlock(&mutex); printf("Spaß freischalten\n"); } int main() { pthread_mutex_init(&mutex, NULL); pthread_t-ID; pthread_create(&id, NULL, Spaß, NULL); Schlaf (1); pid_t pid = gabel(); wenn(pid == -1) { perror("Gabelfehler"); Rückgabe -1; } wenn(pid == 0) { pthread_mutex_lock(&mutex); printf("Kind erhält Sperre\n"); Schlaf (3); pthread_mutex_unlock(&mutex); printf("Kind entsperren\n"); Ausfahrt (0); } warte(NULL); pthread_mutex_destroy(&mutex); printf("Hauptübergabe\n"); gebe 0 zurück; } Ergebnisse der Vermutung:
Erstellen und initialisieren Sie eine globale Sperre Der Hauptthread erstellt einen untergeordneten Thread, um die Sperre zu erhalten. Der Hauptthread schläft eine Sekunde lang, und der untergeordnete Thread erhält die Sperre und sperrt sie. Der untergeordnete Thread schläft 3 Sekunden lang, gibt „Unlock Fun“ aus und der untergeordnete Thread wird beendet. Der Hauptthread beginnt mit der Verzweigung, der untergeordnete Prozess erhält die Sperre und gibt die untergeordnete Sperre aus. Untergeordneter Prozess zum Entsperren, Ausgabe untergeordnetes Entsperren Der Hauptthread des übergeordneten Prozesses wartet auf das Beenden des untergeordneten Prozesses, zerstört schließlich die Sperre und gibt den Hauptthread aus. Also … gehen Sie direkt zum richtigen Code! ! ! 2. Rationale AnalyseLeider ist die Antwort falsch! ! !
Nochmals analysieren: Block? ? Könnte es sein, dass der Kindprozess beim Erwerb der Sperre blockiert wird? Oder ist der übergeordnete Prozess blockiert, während er auf den untergeordneten Prozess wartet? Mit anderen Worten: Beide Stellen sind blockiert. Der Kindprozess wird beim Erwerb der Sperre blockiert, was zur Folge hat, dass der Elternprozess blockiert wird. Überprüfen Sie es! ! Somit wird das Programm an zwei Stellen blockiert. Der Kindprozess wird beim Erwerb der Sperre blockiert, was wiederum eine Blockierung des Elternprozesses zur Folge hat. 3. Problemlösung
(1) Verwenden von pthread_join()Verwenden Sie pthread_join() vor dem Fork. Bevor der untergeordnete Thread endet, wird der Hauptthread blockiert und wartet, bis der untergeordnete Thread endet, bevor er forkt. Zu diesem Zeitpunkt wird die vom untergeordneten Prozess erhaltene Sperre entsperrt. Code: #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #einschließen <sys/wait.h> pthread_mutex_t Mutex; void*Spaß(void*Arg) { pthread_mutex_lock(&mutex); printf("Spaß get lock\n"); Schlaf (3); pthread_mutex_unlock(&mutex); printf("Spaß freischalten\n"); } int main() { pthread_mutex_init(&mutex, NULL); pthread_t-ID; pthread_create(&id, NULL, Spaß, NULL); pthread_join(id, NULL); Schlaf (1); pid_t pid = gabel(); wenn(pid == -1) { perror("Gabelfehler"); Rückgabe -1; } wenn(pid == 0) { pthread_mutex_lock(&mutex); printf("Kind erhält Sperre\n"); Schlaf (3); pthread_mutex_unlock(&mutex); printf("Kind entsperren\n"); Ausfahrt (0); } warte(NULL); pthread_mutex_destroy(&mutex); printf("Hauptübergabe\n"); gebe 0 zurück; } Ergebnis: (2) Verwenden Sie phread_atfork (), um ein Urteil vor der Fork zu registrieren Header-Datei: Vorbereiten: Diese Funktion wird aufgerufen, bevor Fork ausgeführt wird parent: Der übergeordnete Prozess ruft diese Funktion auf, nachdem Fork ausgeführt wurde child: Der untergeordnete Prozess ruft diese Funktion auf, nachdem Fork ausgeführt wurde Rückgabewert: 0 bei Erfolg, Fehlercode bei Fehlschlag Code: #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #einschließen <sys/wait.h> pthread_mutex_t Mutex; void Spaß vorbereiten(void) { pthread_mutex_lock(&mutex); } Leere Elternspaß(Leere) { pthread_mutex_unlock(&mutex); } void child_fun() { pthread_mutex_unlock(&mutex); } void*Spaß(void*Arg) { pthread_mutex_lock(&mutex); printf("Spaß get lock\n"); Schlaf (3); pthread_mutex_unlock(&mutex); printf("Spaß freischalten\n"); } int main() { pthread_mutex_init(&mutex, NULL); pthread_t-ID; pthread_atfork(Spaß vorbereiten, Spaß übergeordnet, Spaß untergeordnet); pthread_create(&id, NULL, Spaß, NULL); Schlaf (1); pid_t pid = gabel(); wenn(pid == -1) { perror("Gabelfehler"); Rückgabe -1; } wenn(pid == 0) { pthread_mutex_lock(&mutex); printf("Kind erhält Sperre\n"); Schlaf (3); pthread_mutex_unlock(&mutex); printf("Kind entsperren\n"); Ausfahrt (0); } warte(NULL); pthread_mutex_destroy(&mutex); printf("Hauptübergabe\n"); gebe 0 zurück; } Ergebnis: Dies ist das Ende dieses Artikels über die Beispiele für Fork- und Mutex-Prozesse in Linux-Multithreading. Weitere relevante Inhalte zu Fork- und Mutex-Prozessen in Linux-Multithreading finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Implementierung des Übergangseffekts für konkave Rechtecke mit linearem Farbverlauf in CSS
>>: So erstellen Sie dynamische QML-Objekte in JavaScript
Busybox: Ein Schweizer Taschenmesser voller klein...
Hallo allerseits, heute werden wir darüber sprech...
1. Über die Registrierung Der offizielle Docker-H...
Einloggen Docker-Anmeldung Schließen Sie die Regi...
Beim Einfügen eines Datensatzes in die MySQL-Date...
Inhaltsverzeichnis 1. Was ist der Ausführungskont...
Dieser Artikel verwendet ein jQuery-Plugin, um ei...
Inhaltsverzeichnis Hintergrund dieser Serie Überb...
Vorwort Um die Hochverfügbarkeit des Systems zu g...
einführen Die RANGE-Partitionierung basiert auf e...
/****************** * Zeitverwaltung des Linux-Ke...
Inhaltsverzeichnis 1. Konzept 2. Umgebungsbeschre...
Speicher-Engine Was ist eine Datenbank-Speicher-E...
vue-cli verwendet stimulsoft.reports.js (Tutorial...
Die Methoden zur Installation von Nginx und mehre...