Heim > Backend-Entwicklung > Golang > Warum werden bei der gleichzeitigen Golang-Programmierung unterschiedliche Array-Längen ausgegeben?

Warum werden bei der gleichzeitigen Golang-Programmierung unterschiedliche Array-Längen ausgegeben?

PHPz
Freigeben: 2024-02-09 11:42:29
nach vorne
648 Leute haben es durchsucht

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.

Frageninhalt

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)
Nach dem Login kopieren

Ausgabe:

b done! a done! d done! c done! after: [d b c a]
Nach dem Login kopieren
a done! d done! c done! b done! after: [d b a]
Nach dem Login kopieren
d done! a done! c done! b done! after: [b]
Nach dem Login kopieren
d done! a done! c done! b done! after: [a b c]
Nach dem Login kopieren
d done! b done! a done! c done! After: [B C]
Nach dem Login kopieren

Lösung

go: Data Race Detector

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
$
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage