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

Mengapakah panjang tatasusunan berbeza dikeluarkan dalam pengaturcaraan golang serentak?

PHPz
Lepaskan: 2024-02-09 11:42:29
ke hadapan
648 orang telah melayarinya

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)
Salin selepas log masuk

Keluaran:

b done! a done! d done! c done! after: [d b c a]
Salin selepas log masuk
a done! d done! c done! b done! after: [d b a]
Salin selepas log masuk
d done! a done! c done! b done! after: [b]
Salin selepas log masuk
d done! a done! c done! b done! after: [a b c]
Salin selepas log masuk
d done! b done! a done! c done! After: [B C]
Salin selepas log masuk

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
$
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan