Don';I don’我没有任何常规,但仍然得到;所有goroutine都处于休眠状态-死锁“;
我在做一些实验。下面是我的代码Don';I don’我没有任何常规,但仍然得到;所有goroutine都处于休眠状态-死锁“;,go,Go,我在做一些实验。下面是我的代码 package main import ( "fmt" "time" ) func main(){ var a chan int a = make(chan int) for j:=0;j<10;j++{ firstRoutine(a, j) time.Sleep(3 * time.Millisecond) } } func firstRoutine(chennel chan int, j int){ i:=
package main
import (
"fmt"
"time"
)
func main(){
var a chan int
a = make(chan int)
for j:=0;j<10;j++{
firstRoutine(a, j)
time.Sleep(3 * time.Millisecond)
}
}
func firstRoutine(chennel chan int, j int){
i:=0
fmt.Println("j = ", j, "chennel = ", chennel)
chennel <- i
}
输出:
F:\Git\GitHub\GO\Prog\Concorrency>go run Channels.go
j = 0 chennel = <nil>
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send (nil chan)]:
main.firstRoutine(0x0, 0x0)
F:/Git/GitHub/GO/Prog/Concorrency/Channels.go:24 +0x11f
main.main()
F:/Git/GitHub/GO/Prog/Concorrency/Channels.go:14 +0x3f
exit status 2
F:\Git\GitHub\GO\Prog\Concorrency>go run Channels.go
j = 0 chennel = 0xc000048060
j = 1 chennel = 0xc000048060
j = 2 chennel = 0xc000048060
j = 3 chennel = 0xc000048060
j = 4 chennel = 0xc000048060
j = 5 chennel = 0xc000048060
j = 6 chennel = 0xc000048060
j = 7 chennel = 0xc000048060
j = 8 chennel = 0xc000048060
j = 9 chennel = 0xc000048060
您正在向通道写入/发送数据,但未从同一通道读取/接收数据。除非从通道中读取/写入数据,否则对通道的写入/读取会阻塞 写入从通道a或使用缓冲通道读取数据的for循环 添加一些日志揭示了第二种情况 在第二种情况下,您已经生成了10个单独的go例程,但所有这些例程都被阻止,因为从未从通道a读取数据,并且在10次迭代后for循环退出,然后是main函数
package main
import (
"fmt"
"time"
)
func main(){
var a chan int
a = make(chan int)
for j:=0;j<10;j++{
go firstRoutine(a, j)
fmt.Println("sleeping")
time.Sleep(3 * time.Millisecond)
fmt.Println("awake")
}
}
func firstRoutine(chennel chan int, j int){
i:=0
fmt.Println("j = ", j, "chennel = ", chennel)
chennel <- i
fmt.Println("pushed to channel"); // never gets printed
}
主程序包
进口(
“fmt”
“时间”
)
func main(){
var a chan int
a=制造(成交量)
对于j:=0;j@hobbs谢谢你提供的信息。你能解释一下怎么做吗?请拿一本涵盖所有语言基础知识的书,包括为什么这段代码会死锁。
package main
import (
"fmt"
"time"
)
func main(){
var a chan int
a = make(chan int)
for j:=0;j<10;j++{
go firstRoutine(a, j)
fmt.Println("sleeping")
time.Sleep(3 * time.Millisecond)
fmt.Println("awake")
}
}
func firstRoutine(chennel chan int, j int){
i:=0
fmt.Println("j = ", j, "chennel = ", chennel)
chennel <- i
fmt.Println("pushed to channel"); // never gets printed
}
package main
import (
"fmt"
"time"
)
func main(){
var a chan int
a = make(chan int, 11) // making a buffered channel of 11 elements
for j:=0;j<10;j++{
go firstRoutine(a, j)
fmt.Println("sleeping")
time.Sleep(3 * time.Millisecond)
fmt.Println("awake")
}
}
func firstRoutine(chennel chan int, j int){
i:=0
fmt.Println("j = ", j, "chennel = ", chennel)
chennel <- i
fmt.Println("pushed to channel"); // gets printed as buffer is bigger than the iterations, so no blocking
}