91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang并發操作中常見的死鎖情形介紹

發布時間:2021-09-01 11:32:14 來源:億速云 閱讀:130 作者:chen 欄目:開發技術

本篇內容介紹了“Golang并發操作中常見的死鎖情形介紹”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

目錄
  • 第一種情形:無緩存能力的管道,自己寫完自己讀

  • 第二種情形:協程來晚了

  • 第三種情形:管道讀寫時,相互要求對方先讀/寫

  • 第四種情形:讀寫鎖相互阻塞,形成隱形死鎖

什么是死鎖,在Go的協程里面死鎖通常就是永久阻塞了,你拿著我的東西,要我先給你然后再給我,我拿著你的東西又讓你先給我,不然就不給你。我倆都這么想,這事就解決不了了。

第一種情形:無緩存能力的管道,自己寫完自己讀

先上代碼:

func main() {
    ch := make(chan int, 0)

    ch <- 666
    x := <- ch
    fmt.Println(x)
}

我們可以看到這是一個沒有緩存能力的管道,然后往里面寫666,然后就去管道里面讀。這樣肯定會出現問題啊!一個無緩存能力的管道,沒有人讀,你也寫不了,沒有人寫,你也讀不了,這正是一種死鎖!

fatal error: all goroutines are asleep - deadlock!

解決辦法很簡單,開辟兩條協程,一條協程寫,一條協程讀。

第二種情形:協程來晚了

func main() {
    ch := make(chan int,0)
    ch <- 666
    go func() {
        <- ch
    }()
}

我們可以看到,這條協程開辟在將數字寫入到管道之后,因為沒有人讀,管道就不能寫,然后寫入管道的操作就一直阻塞。這時候你就有疑惑了,不是開辟了一條協程在讀嗎?但是那條協程開辟在寫入管道之后,如果不能寫入管道,就開辟不了協程。

第三種情形:管道讀寫時,相互要求對方先讀/寫

如果相互要求對方先讀/寫,自己再讀/寫,就會造成死鎖。

func main() {
    chHusband := make(chan int,0)
    chWife := make(chan int,0)

    go func() {
        select {
        case <- chHusband:
            chWife<-888
        }
    }()

    select {
        case <- chWife:
            chHusband <- 888
    }
}

先來看看老婆協程,chWife只要能讀出來,也就是老婆有錢,就給老公發個八百八十八的大紅包。

再看看老公的協程,一看不得了,咋啦?老公也說只要他有錢就給老婆包個八百八十八的大紅包。

兩個人都說自己沒錢,老公也給老婆發不了紅包,老婆也給老公發不了紅包,這就是死鎖!

第四種情形:讀寫鎖相互阻塞,形成隱形死鎖

先來看一看代碼:

func main() {
    var rmw09 sync.RWMutex
    ch := make(chan int,0)

    go func() {
        rmw09.Lock()
        ch <- 123
        rmw09.Unlock()
    }()

    go func() {
        rmw09.RLock()
        x := <- ch
        fmt.Println("讀到",x)
        rmw09.RUnlock()
    }()

    for {
        runtime.GC()
    }
}

這兩條協程,如果第一條協程先搶到了只寫鎖,另一條協程就不能搶只讀鎖了,那么因為另外一條協程沒有讀,所以第一條協程就寫不進。

如果第二條協程先搶到了只讀鎖,另一條協程就不能搶只寫鎖了,那么因為另外一條協程沒有寫,所以第二條協程就讀不到。

“Golang并發操作中常見的死鎖情形介紹”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灵寿县| 英德市| 怀化市| 红河县| 佛学| 剑阁县| 广元市| 瑞昌市| 桦甸市| 九龙县| 无锡市| 花莲市| 贡觉县| 红桥区| 瑞昌市| 新兴县| 广饶县| 林周县| 汽车| 枣强县| 太康县| 吴川市| 定西市| 区。| 安顺市| 仁寿县| 天台县| 凌海市| 兰坪| 江城| 威信县| 高要市| 福清市| 呼图壁县| 青海省| 景洪市| 永新县| 卓尼县| 金寨县| 旺苍县| 宣武区|