婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > 詳解Golang并發(fā)操作中常見的死鎖情形

詳解Golang并發(fā)操作中常見的死鎖情形

熱門標(biāo)簽:電腦外呼系統(tǒng)輻射大嗎 上海企業(yè)外呼系統(tǒng)排名 百度地圖標(biāo)注位置網(wǎng)站 開通400電話申請(qǐng)流程 智能語音電銷的機(jī)器人 400手機(jī)電話免費(fèi)辦理 武漢百應(yīng)人工智能電銷機(jī)器人 如何利用高德地圖標(biāo)注家 揚(yáng)州電銷外呼系統(tǒng)軟件

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

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

先上代碼:

func main() {
    ch := make(chan int, 0)
​
    ch - 666
    x := - ch
    fmt.Println(x)
}

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

fatal error: all goroutines are asleep - deadlock!

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

第二種情形:協(xié)程來晚了

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

我們可以看到,這條協(xié)程開辟在將數(shù)字寫入到管道之后,因?yàn)闆]有人讀,管道就不能寫,然后寫入管道的操作就一直阻塞。這時(shí)候你就有疑惑了,不是開辟了一條協(xié)程在讀嗎?但是那條協(xié)程開辟在寫入管道之后,如果不能寫入管道,就開辟不了協(xié)程。

第三種情形:管道讀寫時(shí),相互要求對(duì)方先讀/寫

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

func main() {
    chHusband := make(chan int,0)
    chWife := make(chan int,0)
​
    go func() {
        select {
        case - chHusband:
            chWife-888
        }
    }()
​
    select {
        case - chWife:
            chHusband - 888
    }
}

先來看看老婆協(xié)程,chWife只要能讀出來,也就是老婆有錢,就給老公發(fā)個(gè)八百八十八的大紅包。

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

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

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

先來看一看代碼:

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()
    }
}

這兩條協(xié)程,如果第一條協(xié)程先搶到了只寫鎖,另一條協(xié)程就不能搶只讀鎖了,那么因?yàn)榱硗庖粭l協(xié)程沒有讀,所以第一條協(xié)程就寫不進(jìn)。

如果第二條協(xié)程先搶到了只讀鎖,另一條協(xié)程就不能搶只寫鎖了,那么因?yàn)榱硗庖粭l協(xié)程沒有寫,所以第二條協(xié)程就讀不到。

到此這篇關(guān)于詳解Golang并發(fā)操作中常見的死鎖情形的文章就介紹到這了,更多相關(guān)Golang 并發(fā)死鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Go 語言中的死鎖問題解決
  • Go語言死鎖與goroutine泄露問題的解決
  • golang coroutine 的等待與死鎖用法
  • go select編譯期的優(yōu)化處理邏輯使用場景分析
  • Django實(shí)現(xiàn)jquery select2帶搜索的下拉框
  • Go語言使用select{}阻塞main函數(shù)介紹
  • matplotlib之多邊形選區(qū)(PolygonSelector)的使用
  • golang中的select關(guān)鍵字用法總結(jié)
  • Go select 死鎖的一個(gè)細(xì)節(jié)

標(biāo)簽:黑龍江 新余 嘉峪關(guān) 延邊 江西 張掖 宜賓 武漢

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解Golang并發(fā)操作中常見的死鎖情形》,本文關(guān)鍵詞  詳解,Golang,并發(fā),操作,中,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解Golang并發(fā)操作中常見的死鎖情形》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解Golang并發(fā)操作中常見的死鎖情形的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 南充市| 九台市| 伊春市| 苏州市| 德阳市| 海原县| 涿鹿县| 彰化县| 诸城市| 英超| 松滋市| 天台县| 德州市| 银川市| 嘉荫县| 保靖县| 桐柏县| 大余县| 玉林市| 青州市| 杨浦区| 池州市| 汽车| 中超| 星子县| 中超| 河南省| 边坝县| 松滋市| 左贡县| 阜城县| 徐闻县| 贵南县| 临猗县| 凉山| 静海县| 池州市| 河北区| 巴塘县| 龙门县| 新密市|