C Gabel Umgang mit der globalen variable
Ich bin nicht zu verstehen, die Ausgabe dieses Programms:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
int i = 0;
int main()
{
while(i<3)
{
fork();
printf("%d\n",i);
++i;
}
}
Ausgabe:
0
1
2
2
1
2
0
1
2
2
2
1
2
2
Kann bitte mir jemand sagen, wie ich dieses Problem angehen, um vollständig zu verstehen, warum ich immer diese Ausgabe?
- Sie haven T erzählte Sie uns, was Ihnen nicht gefällt.
- Ich mag nicht, weil ich nicht verstehen, wenn wir incrementig die Gabel auf den übergeordneten Prozess oder in der Kinder-Prozesse. Normalerweise, wenn wir wollen die Erhöhung der Kind-Prozess, die wir tun if(fork()==0)++i; aber wenn wir es tun Gabel wie diese, ich bekomme ein wenig verloren in der Mitte!
- Als pro-Antwort: Kind Schritten von Kind, Eltern-Schritten Eltern, nie die twain meed.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gabel wird eine Kopie des Prozesses. Eine unabhängige Kopie des Prozesses. Also, wenn Sie eine Globale variable enthält 3 zum Zeitpunkt Gabel, jede Kopie des Prozesses bekommt Ihre ganz eigenen 3. Und wenn Sie ändern, Ihre änderungen sind vollständig unabhängig voneinander.
Den code ändern, um diese und die Ausgabe sollte machen viel mehr Sinn:
Wenn du fork () eine komplette Kopie des aktuellen Prozesses ist erstellt, die in Ihrem aktuellen Zustand. Dies bedeutet, dass Ihre ersten Prozess werden drei neue Verfahren, die in der Mitte der while-Schleife, mit
i
wird jeweils 0, 1 und 2, in jedem von Ihnen. Es wird auch drucken, seine eigenen Wertei
.Jedes Ihrer Kinder wird weiterhin die Schleife von der
fork()
Aufruf von drucken aus seiner ersteni
Wert inkrementiert und die Schleife. Dies bedeutet, dass Kinder 0-print-0, 1, und 2, und spawnen zwei neue Kinder, mit den "ursprünglichen" Werte deri
1 und 2. Kinder von 1 drucken 1 und 2 und spawn eine mehr Kindern, mit einem "initial" - Wert voni
2. Für Kinder von 2 drucken 2 und verlassen die Schleife.Wenn Sie weiterhin auf diese Argumentation kommen Sie zu dem Schluss, dass insgesamt zwei 0 vier 1-und acht 2 gedruckt werden. Aber, da die Reihenfolge der Ausführung hängt davon ab, wie das OS plant die gleichzeitige Prozesse, Sie können nicht garantiert auf der Bestellung gedruckt werden.
Versuchen Sie es mit pthreads-wenn Sie möchten, erstellen Sie einen thread innerhalb des Prozesses für die gleichzeitige Programmierung. Die Funktion, die Sie wollen, ist pthread_create und pthread_join für das Aufräumen später.
Etwas wie dieses:
Vielleicht aber auch nicht, abhängig von Ihren tatsächlichen Bedarf.
Er ist so etwas wie...
...etc
Den Auftrag, die Abläufe sind-Ausgabe, ist jedoch unbestimmt, so dass Sie wahrscheinlich nicht sehen Sie den genau gleichen output, jedes mal, und selbst wenn Sie es tun, ist nicht etwas, das Sie garantieren können.
Wie gesagt, jeder Prozess hat seine eigene Globale 'ich', die es verfolgt, und sein Wert wird einfach der Wert der Verzweigung des Prozesses i an der Gabel.