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:数据竞争检测器
您存在数据竞争。
$ 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编程中输出不同的数组长度?的详细内容,更多请关注编程网其它相关文章!