Rumah >pembangunan bahagian belakang >Golang >Mengapakah panjang tatasusunan berbeza dikeluarkan dalam pengaturcaraan golang serentak?

Mengapakah panjang tatasusunan berbeza dikeluarkan dalam pengaturcaraan golang serentak?

PHPz
PHPzke hadapan
2024-02-09 11:42:29651semak imbas

Mengapakah panjang tatasusunan berbeza dikeluarkan dalam pengaturcaraan golang serentak?

editor php Yuzai akan menjawab soalan anda tentang mengeluarkan panjang tatasusunan yang berbeza dalam pengaturcaraan golang serentak. Dalam pengaturcaraan serentak, apabila berbilang gorout mengendalikan sumber yang dikongsi pada masa yang sama, keadaan perlumbaan mungkin berlaku, mengakibatkan keputusan yang tidak menentu. Apabila berbilang goroutin beroperasi pada tatasusunan pada masa yang sama, panjang tatasusunan mungkin berbeza. Ini kerana susunan pelaksanaan antara goroutine tidak pasti, dan operasi baca dan tulis mungkin berlaku pada masa yang sama, mengakibatkan ketidakkonsistenan dalam panjang tatasusunan. Untuk menyelesaikan masalah ini, anda boleh menggunakan mekanisme seperti kunci mutex atau saluran untuk memastikan penyegerakan dan pelaksanaan berurutan antara goroutine, untuk mendapatkan hasil tertentu.

Kandungan soalan

Saya sedang menulis program mudah dalam golang untuk ujian serentak, tetapi tidak faham capitalized output berbeza saiz array setiap kali!

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)

Keluaran:

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]

Penyelesaian

go: Pengesan Perlumbaan Data

Anda mempunyai persaingan data.

$ 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)
}

Atas ialah kandungan terperinci Mengapakah panjang tatasusunan berbeza dikeluarkan dalam pengaturcaraan golang serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam