2 回答

TA貢獻(xiàn)1801條經(jīng)驗 獲得超8個贊
在 Go 中,死鎖是指所有現(xiàn)有的 goroutine 都被阻塞。
您的示例有一個 goroutine(主 goroutine)被阻塞,因此所有 goroutine 都被阻塞,因此這是一個死鎖。
注意:由于所有的 goroutines 都被阻塞,新的 goroutines 不會(不能)被啟動(因為它們只能從正在運行的 goroutines 啟動)。如果所有的 goroutine 都被阻塞并且不能做任何事情,那么永遠(yuǎn)等待是沒有意義的。所以運行時退出。
編輯:
您在 main 中使用 sleep 的編輯代碼與此重復(fù):Go channel deadlock is not occur。基本上睡眠不是永久阻塞操作(睡眠持續(xù)時間是有限的),因此在死鎖檢測中不考慮 goroutine 睡眠。
編輯#2:
從那時起,您刪除了,sleep()
但它并沒有改變?nèi)魏螙|西。你有 2 個 goroutine:main
和一個正在執(zhí)行makeRandom()
. makeRandom()
被阻止而main()
不是。所以并不是所有的 goroutine 都被阻塞了,所以這不是死鎖。
編輯#3:
在您的最后一個示例中,當(dāng)運行時檢測到死鎖時,只有一個 goroutine 仍在運行:main()
. 確實,您啟動了一個正在執(zhí)行的 goroutine worker()
,但這只會打印一個文本并終止?!斑^去”的 goroutine 不算數(shù),終止的 goroutine 也無法改變現(xiàn)有 goroutine 的阻塞狀態(tài)。只有現(xiàn)有的 goroutine 才算。

TA貢獻(xiàn)1804條經(jīng)驗 獲得超2個贊
查看這篇文章以了解為什么通道上的 go-routine 塊被認(rèn)為是死鎖: http ://dmitryvorobev.blogspot.com/2016/08/golang-channels-implementation.html
在上面的示例中,主 goroutine 被添加到等待隊列(sendq)中,并且在 Go 運行一些從通道接收值的 goroutine 之前無法釋放。
- 2 回答
- 0 關(guān)注
- 144 瀏覽
添加回答
舉報