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

     
    }
  • 相关阅读:
    话说Hibernate和ADO.NET —练习随笔小记
    二次开发WinWebMail邮件系统接口 企业邮件服务器解决方案
    一个Windows后台服务(.Net的C#版) 定时访问数据库循环发送手机短信
    SQL UPDATE 联合表更新的问题
    2009新的篇章,惠海→时代财富→广佛都市网
    在WebService中使用Session或Cookie实现WebService身份验证(客户端是Flex)
    门户网站的形成—CMS内容管理系统
    CSS实现0.5px的边框或线
    《后人诗》
    CentOS6下docker的安装和使用
  • 原文地址:https://www.cnblogs.com/jay--zhang/p/8607696.html
Copyright © 2011-2022 走看看