好吧,去“专家”。你会如何用惯用的 Go 编写这段代码,也就是没有互斥锁next?
package main
import (
"fmt"
)
func main() {
done := make(chan int)
x := 0
for i := 0; i < 10; i++ {
go func() {
y := next(&x)
fmt.Println(y)
done <- 0
}()
}
for i := 0; i < 10; i++ {
<-done
}
fmt.Println(x)
}
var mutex = make(chan int, 1)
func next(p *int) int {
mutex <- 0
// critical section BEGIN
x := *p
*p++
// critical section END
<-mutex
return x
}
假设你不能同时在临界区有两个 goroutine,否则会发生不好的事情。
我的第一个猜测是有一个单独的 goroutine 来处理状态,但我想不出匹配输入/输出的方法。
墨色风雨
守着星空守着你
相关分类