Heim >Backend-Entwicklung >Golang >Warum werden bei der gleichzeitigen Golang-Programmierung unterschiedliche Array-Längen ausgegeben?
php-Editor Yuzai beantwortet Ihre Frage zur Ausgabe verschiedener Array-Längen in der gleichzeitigen Golang-Programmierung. Wenn bei der gleichzeitigen Programmierung mehrere Goroutinen gleichzeitig eine gemeinsame Ressource betreiben, können Rennbedingungen auftreten, die zu unsicheren Ergebnissen führen. Wenn mehrere Goroutinen gleichzeitig Arrays bearbeiten, können die Array-Längen unterschiedlich sein. Dies liegt daran, dass die Ausführungsreihenfolge zwischen Goroutinen ungewiss ist und Lese- und Schreibvorgänge möglicherweise gleichzeitig erfolgen, was zu Inkonsistenzen bei den Array-Längen führt. Um dieses Problem zu lösen, können Sie Mechanismen wie Mutex-Sperren oder Kanäle verwenden, um die Synchronisierung und sequentielle Ausführung zwischen Goroutinen sicherzustellen und so bestimmte Ergebnisse zu erzielen.
Ich schreibe ein einfaches Programm in Golang für Parallelitätstests, verstehe aber nicht, capitalized
die unterschiedliche Ausgabe der Array-Größe jedes Mal!
data := []rune{'a', 'b', 'c', 'd'} var capitalized []rune capit := func(r rune) { capitalized = append(capitalized, unicode.toupper(r)) fmt.printf("%c done!\n", r) } fmt.printf("before: %c\n", capitalized) for i := 0; i < len(data); i++ { go capit(data[i]) } time.sleep(100 * time.millisecond) fmt.printf("after: %c\n", capitalized)
Ausgabe:
b done! a done! d done! c done! after: [d b c a]
a done! d done! c done! b done! after: [d b a]
d done! a done! c done! b done! after: [b]
d done! a done! c done! b done! after: [a b c]
d done! b done! a done! c done! After: [B C]
Sie haben Datenkonkurrenz.
$ go run -race racer.go before: [] ================== warning: data race write at 0x00c000012018 by goroutine 8: main.main.func1() racer.go:14 +0xc4 main.main.func2() racer.go:20 +0x3e previous read at 0x00c000012018 by goroutine 7: main.main.func1() racer.go:14 +0x44 main.main.func2() racer.go:20 +0x3e goroutine 8 (running) created at: main.main() racer.go:20 +0x199 goroutine 7 (running) created at: main.main() racer.go:20 +0x199 ================== a done! ================== warning: data race write at 0x00c000012018 by goroutine 9: main.main.func1() racer.go:14 +0xc4 main.main.func2() racer.go:20 +0x3e previous write at 0x00c000012018 by goroutine 10: main.main.func1() racer.go:14 +0xc4 main.main.func2() racer.go:20 +0x3e goroutine 9 (running) created at: main.main() racer.go:20 +0x199 goroutine 10 (running) created at: main.main() racer.go:20 +0x199 ================== d done! b done! c done! after: [b c] found 2 data race(s) exit status 66 $
racer.go:
package main import ( "fmt" "time" "unicode" ) func main() { data := []rune{'a', 'b', 'c', 'd'} var capitalized []rune capIt := func(r rune) { capitalized = append(capitalized, unicode.ToUpper(r)) fmt.Printf("%c done!\n", r) } fmt.Printf("Before: %c\n", capitalized) for i := 0; i < len(data); i++ { go capIt(data[i]) } time.Sleep(100 * time.Millisecond) fmt.Printf("After: %c\n", capitalized) }
Das obige ist der detaillierte Inhalt vonWarum werden bei der gleichzeitigen Golang-Programmierung unterschiedliche Array-Längen ausgegeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!