了解围棋中的僵局



我从编程课程中给出的示例中摘录了以下内容,我不确定为什么会发生死锁。

package main
import (
"fmt"
)
var (
Count      int = 0
nFunctions int = 2
)
var sema = make(chan int)
func increment(ch chan int, nSteps int) {
for i := 0; i < nSteps; i++ {
<- sema  
cnt := Count
Count = cnt + 1
ch <- 1
sema <- 1
}
return
}
func main() {
ch := make(chan int)
sema <- 1
go increment(ch, 1000)
go increment(ch, 1000)
for i := 0; i < nFunctions*1000; i++ {
<-ch
}
fmt.Printf("Count = %dn", Count)
}

奇怪的是,当我将语句从sema <- 1更改为

go func () {
sema <- 1
}()

对此的任何解释都非常感谢。错误消息是: 致命错误:所有 goroutines 都睡着了 - 死锁!

Go例程 1 [陈发送]: main.main((

通道会同时阻止发送方和接收方。如果您发送某些内容,则在收到之前会阻止您。你可以进一步减少你的代码,你所需要的只是一个通道,然后写入该通道。请注意,您还可以使用缓冲通道,该通道允许写入缓冲区长度而不会阻塞。但是,如果缓冲区已满,它仍然会阻塞。

最新更新