Endlosschleife mit Nullen beim Versuch, Deadlock zu erreichen

8

Der folgende Code druckt weiterhin 0 .

%Vor%

Aus meiner Sicht sollte es 0 auf 9 drucken und dann in eine Endlosschleife gehen. Warum druckt es weiterhin zero ?

    
Suhail Gupta 30.09.2017, 09:25
quelle

1 Antwort

12

Ihr Verständnis ist (fast) korrekt, außer dass die Endlosschleife in der Hauptgoroutine nicht blockiert, sondern unnachgiebig empfangen und gedruckt wird.

Die Gorroutine, die Sie starten, sendet die Zahlen 0, 1, ... 9 auf dem Kanal, dann schließt sie. Und der Empfang von einem geschlossenen Kanal blockiert nicht, im Gegenteil, er kann sofort ablaufen und ergibt den Nullwert des Elementtyps des Kanals, der 0 für den Typ int ist. Dies ist in Spezifikation: Empfangsoperator:

angegeben
  

Empfangen von einem nil -Kanal blockiert für immer. Eine Empfangsoperation für einen geschlossenen -Kanal kann immer sofort fortgesetzt werden, wodurch der Elementtyp Nullwert , nachdem zuvor gesendete Werte empfangen wurden.

So sehen Sie genau, was Sie sollten. Zuerst druckt es die Zahlen 0..9 , dann druckt 0 sehr schnell (ohne Verzögerung), so dass Sie wahrscheinlich nicht einmal die anfänglichen 0..9 Zahlen bemerken.

Wenn Sie Ihr Beispiel leicht modifizieren, so dass die Schleife in der Hauptgoroutine nach 15 Iterationen endet, wird sofort angezeigt, was passiert:

%Vor%

Ausgabe (versuchen Sie es auf dem Go Playground ):

%Vor%

Wenn dein Ziel ist, sobald alle gesendeten Nummern verarbeitet (gedruckt) wurden, benutze for range auf dem Kanal:

%Vor%

Wenn Ihr Ziel ist, zu blockieren, bis neue Nummern verfügbar sind, sobald diese 10 Nummern verarbeitet wurden, dann schließen Sie den Kanal nicht. Auf diese Weise wird der nächste Empfangsvorgang blockiert. In diesem Fall würden sowohl die ursprüngliche Schleife als auch die for range -Schleife funktionieren, aber for range ist besser, da diese immer beendet wird, wenn der Kanal geschlossen wird.

Sehen Sie sich diese Frage an und merken Sie sich die Kanalaxiome: How verhält sich ein nicht initialisierter Kanal?

    
icza 30.09.2017, 10:13
quelle

Tags und Links