go goroutine死锁
http://blog.csdn.net/kjfcpua/article/details/18265441
unc main() {
nat := make(chan int)
squ := make(chan int)
go func() {
for x := 0; x < 100; x++ {
nat <- x
}
}() //没有close(nat) 造成死锁 ?为什么会死锁呢
//fatal error: all goroutines are asleep - deadlock!
//goroutine 1 [chan receive]:
go func() {
for {
if x, ok := <-nat; !ok {
break
} else {
squ <- x * x
}
}
close(squ)
}()
for x := range squ {
fmt.Println(x)
}
}
如下是不会死锁的,也不会阻塞是由垃圾回收器回收。
func main() {
nat := make(chan int)
go func() {
for x := 0; x < 100; x++ {
nat <- x
}
}()
fmt.Println(9999)
}
package main
import (
"fmt"
"sync"
)
func test1() int {
sizes := make(chan int)
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Println("i:", i)
sizes <- i
}(i)
}
fmt.Println("下一步")
go func() { //如果不用go,则是在main的goroutine中执行,则wg.Wait()会等待,阻塞了主进程,造成死锁。不要阻塞主进程。
wg.Wait()
close(sizes)
}()
var total int
for size := range sizes {
fmt.Println("循环:", size)
total += size
}
return total
}
func main() {
fmt.Println(test1()) //test1是位于main这个主goroutine中的。
下一步 //位于主goroutine中,先执行
i: 3 //写和读,都是异步的
i: 4
循环: 3
i: 0
循环: 4
循环: 0
i: 1
i: 2
循环: 1
循环: 2
10
}