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

     
    }
  • 相关阅读:
    JMeter接口测试系列:Jmeter+jenkins+ant 的自动化构建
    BZOJ1434:[ZJOI2009]染色游戏(博弈论)
    BZOJ4241:历史研究(回滚莫队)
    BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)
    BZOJ1188:[HNOI2007]分裂游戏(博弈论)
    BZOJ1022:[SHOI2008]小约翰的游戏John(博弈论)
    BZOJ1406:[AHOI2007]密码箱(数论)
    BZOJ3270:博物馆(高斯消元)
    CF993E:Nikita and Order Statistics(FFT)
    HDU4609:3-idiots(FFT)
  • 原文地址:https://www.cnblogs.com/jay--zhang/p/8607696.html
Copyright © 2011-2022 走看看