美文网首页
Go-channel锁机制

Go-channel锁机制

作者: 骑蜗上高速 | 来源:发表于2019-12-26 15:18 被阅读0次

    死锁:
    1、单goroutine自己死锁
    channel应该至少在两个以上的goroutine中进行通信,否则死锁
    代码示例:

    package main
    import "fmt"
    func main () {
        ch := make(chan int)
        ch <- 88
        num :=<- ch
        fmt.Println("读到",num)
    }
    

    输出结果:

    fatal error: all goroutines are asleep - deadlock!
    

    2、goroutine之间channel访问顺序导致死锁
    使用channel一端读(写),需要保证另一端写(读)
    示例代码:

    package main
    import "fmt"
    func main () {
        ch := make(chan int)
        num :=<- ch
        go func() {
            ch <- 88
        }()
    
        fmt.Println("读到",num)
    }
    

    输出结果:

    fatal error: all goroutines are asleep - deadlock!
    

    正确的顺序是:

    package main
    import "fmt"
    func main () {
        ch := make(chan int)
        go func() {
            ch <- 88
        }()
        num :=<- ch
        fmt.Println("读到",num)
    }
    

    结果:

    读到 88
    

    3、多goroutine,多channel交叉死锁。channel和mutex同时使用会产生交叉死锁。

    package main
    func main () {
        ch1 := make(chan int)
        ch2 := make(chan int)
        go func() {
            for {
                select {
                case num1 := <- ch1:
                    ch2 <- num1
                }
            }
        }()
        for {
            select {
            case num2 := <- ch2:
                ch1 <- num2
            }
        }
    }
    

    输出结果:

    fatal error: all goroutines are asleep - deadlock!
    

    4、在go中,尽量不要将互斥锁、读写锁与channel混用 ------隐性死锁 。

    相关文章

      网友评论

          本文标题:Go-channel锁机制

          本文链接:https://www.haomeiwen.com/subject/vhtloctx.html