Ich habe eine knifflige Zeit zu verstehen, wie man die Kontrolle zwischen zwei Prozessen mit Semaphoren wechseln. Hier ist ein künstliches Beispiel für den Prozessbehandlungscode.Synchronisieren von Prozessen mit Semaphoren
int pid = fork();
if (pid) {
int counter = 0;
while (true) {
counter += 1;
printf("P%d = %d", pid, counter);
}
} else {
int counter = 0;
while (true) {
counter += 1;
printf("P%d = %d", pid, counter);
}
}
Ich erwarte den obigen Code parallel laufen zu lassen, aber es scheint wie Kontrollfluss sofort für den gegabelten Prozess wird fortgesetzt, und erst später wieder für den übergeordneten Prozess.
Dies ist grundlegend brechen meine bestehenden Code, der ein Semaphor verwendet, um zu steuern, welcher Prozess kann handeln.
int id = get_semaphore(1);
int pid = fork();
if (pid) {
int counter = 0;
while (true) {
sem_wait(id);
counter += 1;
printf("P%d = %d\n", pid, counter);
sem_signal(id);
}
} else {
int counter = 0;
while (true) {
sem_wait(id);
counter += 1;
printf("P%d = %d\n", pid, counter);
sem_signal(id);
}
}
Der
sem_wait
helper subtrahiert nur 1 von dem Semaphor-Wert und blockiert, bis das Ergebnis> 0 ist (verwendetsemop
unter der Motorhaube).Der Helfer
sem_signal
fügt nur 1 zum Semaphorwert hinzu (verwendetsemop
unter der Haube).
würde ich der Code wie zwischen den beiden Prozessen zu wechseln, sem_wait
mit den anderen Verfahren, die Ressourcen mit sem_signal
Mitteilungen zu blockieren, bis. Die gewünschte Ausgabe wäre:
P1 = 0
P0 = 0
P1 = 1
P0 = 1
...
jedoch wegen der anfänglichen Ausführungsverzögerung zwischen den Prozessen, nimmt das Kind Prozess die verfügbare Semaphor Ressource, verwendet es eine Reihe zu drucken, stellt sich wieder her, dann und Schleifen - wobei an diesem Punkt Die Ressource ist wieder verfügbar und wird fortgesetzt, ohne jemals auf den anderen Prozess zu warten.
Was ist der beste Weg, um zu verhindern, dass ein Prozess Ressourcen verwendet, wenn er sie selbst freigegeben hat?
Sie benötigen zwei Semaphore und eine 'executeNow'-Einheit. Führen Sie die Einheit zwischen den Prozessen hin und her. – ThingyWotsit