golang中死鎖的情況分析

2021-08-28 10:34:23 字數 1537 閱讀 4788

golang關於channel死鎖情況的彙總以及解決方案

直接讀取空channel的死鎖

當乙個channel中沒有資料,而直接讀取時,會發生死鎖:

func main()
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:

main.main()

/home/erick/desktop/book/parallel/final.go:159 +0x4d

exit status 2

上述**中,建立了乙個2個容量的channel,直接讀取發生了死鎖情況。

修正方案,使用select方法阻止,在default中放置預設處理方式:

func main() 

}

輸出:

nothing in channel

過度寫入資料造成的死鎖

寫入資料超過channel的容量,也會造成死鎖:

func main()
解決方案,與寫入的方式一樣,使用select方法阻止,在default中放置預設處理方式:

func main() 

}

向已經關閉的channel中寫入資料

這種造成的不是死鎖,而是產生panic。

func main()
**錯誤:

panic: send on closed channel

goroutine 1 [running]:

main.main()

/home/erick/desktop/book/parallel/final.go:154 +0x63

exit status 2

解決方案:只有別向已經關閉的channel寫資料。。。。

但是,可以從已經關閉的channel中讀取資料:

func main()
下面開始講解goroutine的讀寫

package main

import "fmt"

func main() ()

fmt.println(<-c)

}

上面這個是對的

package main

import "fmt"

func main() ()

}

上面這個是錯的,會發生死鎖,因為程式會阻塞在fmt.println(<-c),並不會向下執行。在該行發生了阻塞,以致於下面的**沒有機會執行。因此可以總結寫在讀前,寫操作完成後才有讀操作。

總結:上述提到的死鎖,是指在程式的主線程中發生的情況,如果上述的情況發生在非主線程中,讀取或者寫入的情況是發生堵塞的,而不是死鎖。實際上,阻塞情況省去了我們加鎖的步驟,反而是更加有利於**編寫,要合理的利用阻塞。。

channel 死鎖的情況

主協程一定不能阻塞 要不然會報 dielock error區別 無緩衝通道本身不儲存資訊,它只負責轉手,有人傳給它,它就必須要傳給別人,如果只有進或者只有出的操作,都會造成阻塞。有緩衝的可以儲存指定容量個變數,但是超過這個容量再取值也會阻塞。死鎖情況1 取完了通道儲存的資訊再去取資訊,也會死鎖 fu...

詳解MySQL中的死鎖情況以及對死鎖的處理方法

當多個事務同時持有和請求同一資源上的鎖而產生迴圈依賴的時候就產生了死鎖。死鎖發生在事務試圖以不同的順序鎖定資源。以stockprice表上的兩個事務為例 事務1start transaction update stockprice set close 45.50 where stock id 4 a...

關於Golang使用channel的死鎖問題

小白一枚,最近在入門學習golang,在學到channel時,發現總會遇到死鎖的問題 fatal error all goroutines are asleep deadlock 所以,當我們寫的程式生產和消費的數量不對等時,便會發生阻塞造成死鎖 生產者阻塞 生產4條訊息,只消費3條 package...