Heim  >  Artikel  >  Backend-Entwicklung  >  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
PHPznach vorne
2024-02-09 11:42:29579Durchsuche

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)

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]

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
$

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen