php小编鱼仔为你解答并发golang编程中输出不同的数组长度的问题。在并发编程中,多个goroutine同时操作一个共享资源,可能会出现竞争条件导致结果不确定。当多个goroutine同时对数组进行操作时,可能会导致数组长度不同的情况。这是因为goroutine之间的执行顺序是不确定的,可能会出现同时进行读写操作的情况,从而导致数组长度的不一致。要解决这个问题,可以使用互斥锁或通道等机制来保证goroutine之间的同步与顺序执行,从而得到确定的结果。
我正在用 golang 编写一个简单的程序用于并发测试,但不明白 capitalized
每次数组大小的不同输出!
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)
输出:
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]
您存在数据竞争。
$ 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) }
以上是为什么并发golang编程中输出不同的数组长度?的详细内容。更多信息请关注PHP中文网其他相关文章!