alle goroutines schlafen - Deadlock

8

Für eine meiner Anforderungen muss ich eine Anzahl von Worker-Go-Routinen erstellen, die von einer Überwachungsroutine überwacht werden. Überwachungsroutine muss beendet werden, wenn alle Worker-Routinen abgeschlossen sind. Mein Code endet im Deadlock, bitte helfen.

%Vor%     
vrbilgi 10.11.2013, 17:29
quelle

1 Antwort

10

Dein Monitorarbeiter stirbt niemals. Wenn alle Arbeiter fertig sind, wartet es weiter auf CS. Diese Deadlocks, weil nichts anderes auf cs senden wird und daher wird wg niemals 0 erreichen. Eine mögliche Lösung ist, dass der Monitor den Kanal schließt, wenn alle Worker fertig sind. Wenn die for-Schleife in main ist, beendet sie die Schleife, kehrt von main zurück und beendet das Programm.

Zum Beispiel: Ссылка

%Vor%

Bearbeiten: Dies ist eine Antwort auf den ersten Kommentar von OP.

Ihr Programm besteht aus drei Teilen, die synchronisiert werden müssen. Zunächst müssen alle Ihre Mitarbeiter die Daten senden. Dann muss Ihre Druckschleife diese Daten drucken. Dann muss Ihre Hauptfunktion zurückkehren, um das Programm zu beenden. In Ihrem Beispiel senden alle Worker die Daten, alle Daten werden gedruckt, aber die Nachricht wird nie an main gesendet, die sie ordnungsgemäß zurückgeben soll.

In meinem Beispiel teilt main dem Drucker und "monitorWorker" nur main mit, wenn es alle Daten erhalten hat, die gedruckt werden müssen. Auf diese Weise endet das Programm ordnungsgemäß und nicht durch Deadlock.

Wenn Sie darauf bestehen, dass sich die Druckschleife in einer anderen Goroutine befindet, können Sie das tun. Aber dann muss eine zusätzliche Kommunikation an main gesendet werden, damit es zurückkommt. Im nächsten Beispiel verwende ich einen Kanal, um die Hauptpunkte zu sichern, wenn alle Daten gedruckt werden.

%Vor%     
Stephen Weinberg 10.11.2013, 17:52
quelle

Tags und Links