var mu sync.Mutex
func produce(ch chan<- int){
for i:=0;i<10;i++{
mu.Lock()
ch<-i
fmt.Println("produce:"+strconv.Itoa(i))
mu.Unlock()
}
}
func consumer(ch <- chan int){
for i:=0;i<10;i++{
mu.Lock()
v:=<-ch
fmt.Println("consumer:"+strconv.Itoa(v))
mu.Unlock()
}
}
func main(){
ch:=make(chan int,5)
go produce(ch)
go consumer(ch)
time.Sleep(10*time.Second)
}
我是 go 的初学者,我今天写了一个问题代码。本意是让资源生成和消费的时候同时打印出该资源信息。 我知道当 consumer 先执行时会导致死锁,但是我不明白的是为什么 produce 先执行时,即使他释放了锁,consumer 也竞争不到锁,produce 会一直占有锁,这里面的竞争规则是什么样的?我在网上没有找到满意的答案
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.