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

     
    }
  • 相关阅读:
    如何使网站不出现从客户端(:)中检测到有潜在危险的 Request.Path 值这样类似的提示
    layui下select下拉框不显示或没有效果
    video
    各个平台的mysql重启命令
    微信开放平台 redirect_uri参数错误
    JS中setTimeout()的用法详解
    验证视图状态MAC失败的解决办法
    The 'microsoft.jet.oledb.4.0' provider is not registered on the local machin
    一个Nginx部署多个vue前端项目总结
    Java之HttpClient调用WebService接口发送短信源码实战
  • 原文地址:https://www.cnblogs.com/jay--zhang/p/8607696.html
Copyright © 2011-2022 走看看