Go語言之死鎖的4種常見情況

2021-10-16 11:28:52 字數 1055 閱讀 6836

死鎖並不是鎖的一種,而是一種錯誤使用鎖導致的現象,死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。系統發生死鎖現象不僅浪費大量的系統資源,甚至導致整個系統崩潰,帶來災難性後果。所以,對於死鎖問題在理論上和技術上都必須予以高度重視。

單go程自己死鎖

func

main()

2.go程間channel訪問順序導致死鎖

func

main()

()}

3.多go程,多channel 交叉死鎖

func

main()

}}()

for}

}

將 互斥鎖、讀寫鎖 與 channel 混用。 —— 隱性死鎖。

下面**造成**死鎖的原因是,進行readgo函式時,以讀的模式加鎖,同時 channel 等待資料寫入,以便於資料的讀出,此時channel等到資料寫入造成堵塞,下面**無法執行,造成以讀模式的鎖無法解鎖。但進入到writego函式中時,向下執行時,遇到以寫模式加鎖時會造成堵塞,因為上方以讀的模式的鎖並沒有解鎖,造成以寫模式加鎖下方的**無法執行,無法向channel中寫入資料,使其互相堵塞,但是控制台並不報錯,該死鎖稱為隱性死鎖。

import

("fmt"

"math/rand"

"sync"

"time"

)var rwmutex sync.rwmutex

//讀時共享,寫時獨佔

func

readgo

(in <-

chan

int,idx int)}

func

writego

(out chan

<-

int,idx int)}

func

main()

for i:=

0;i<

5;i++

}

go語言之包的概念

包是結構化 的一種方式 每個程式都由包 通常簡稱為 pkg 的概念組成,可以使用自身的包或者從其它包中匯入內容。和python一樣,把相同功能的 放到乙個目錄,稱之為包 包可以被其他包引用 main包是用來生成可執行檔案,每個程式只有乙個main包 main包裡有且只有main函式 包的主要用途是提...

Go語言裡channel的死鎖

最近看了下go語言並寫了些示例 在用到channel的時候報了個奇怪的錯誤然後退出 fatal error all goroutines are asleep deadlock 在stackoverflow上搜到 查了查,出錯的 如下 func chanfunc c chan int,d chan ...

執行緒的故事 附4 多執行緒程式設計之死鎖

死鎖是指兩個或兩個以上的執行緒 程序 在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的執行緒 程序 稱為死鎖執行緒 程序 看個新聞先 伊朗說,你放了我們的格蕾絲,我們就放了你們的sten...