Ich versuche, Nebenläufigkeit in Go zu verstehen. Insbesondere schrieb ich dieses Thread-unsicheres Programm:Understanding goroutines
package main
import "fmt"
var x = 1
func inc_x() { //test
for {
x += 1
}
}
func main() {
go inc_x()
for {
fmt.Println(x)
}
}
ich erkennen, dass ich Kanäle verwenden sollte Rennbedingungen mit x
zu verhindern, aber das ist nicht der Punkt hier. Das Programm druckt 1
und scheint dann für immer zu loopen (ohne mehr zu drucken). Ich würde erwarten, dass es eine unendliche Liste von Zahlen druckt, möglicherweise einige überspringt und andere aufgrund der Wettlaufsituation wiederholt (oder schlimmer - die Nummer wird gedruckt, während sie in inc_x
aktualisiert wird).
Meine Frage ist: Warum druckt das Programm nur eine Zeile?
Nur um klar zu sein: Ich benutze keine Kanäle für dieses Spielzeug Beispiel.
Nur gedacht, ich würde erwähnen, dass seit Go 1.2 der Scheduler bei der Funktionseingabe in regelmäßigen Abständen aufgerufen werden kann. Es würde diesen Fall lösen, denke ich nicht, aber es hilft, wenn Sie eine enge Schleife haben, die eine nicht-inlined Funktion aufruft. –