zoukankan      html  css  js  c++  java
  • 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

     
    }
  • 相关阅读:
    物理机和虚拟机互相可以ping通,还是无法连接
    CentOS 7: ping Name or service not known
    Ubuntu上安装搜狗输入法(sogou)
    成功安装 tesserocr
    The following untracked working tree files would be overwritten by merge
    切换本地凭据(Windows上登录的GitHub账号)
    配置了SSH后还是每次都要求输入密码
    dpkg dependency problems prevent configuration
    mui 设置应用全屏模式
    解决烦人的缓存问题!
  • 原文地址:https://www.cnblogs.com/jay--zhang/p/8607696.html
Copyright © 2011-2022 走看看