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.
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]
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!