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

 
}
posted @ 2018-03-20 10:23  jay-  阅读(289)  评论(0编辑  收藏  举报