第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么通道上的 go-routine 塊被認(rèn)為是死鎖?

為什么通道上的 go-routine 塊被認(rèn)為是死鎖?

Go
慕容3067478 2022-06-01 18:00:56
根據(jù)此處的定義,死鎖與資源爭用有關(guān)。在操作系統(tǒng)中,當(dāng)一個進(jìn)程或線程進(jìn)入等待狀態(tài)時就會發(fā)生死鎖,因為請求的系統(tǒng)資源被另一個等待進(jìn)程占用,而另一個等待進(jìn)程又在等待另一個等待進(jìn)程占用的另一個資源。如果一個進(jìn)程不能無限期地改變它的狀態(tài),因為它請求的資源正在被另一個等待的進(jìn)程使用,那么系統(tǒng)就被稱為死鎖。在下面的代碼中:package mainimport "fmt"func main() {    c := make(chan string)    c <- "John"    fmt.Println("main() stopped")}main()go-routine 阻塞,直到任何其他 go-routine(沒有這樣)從該通道讀取相同的數(shù)據(jù)。但輸出顯示:$ bin/cs61a fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan send]:main.main()        /home/user/../myhub/cs61a/Main.go:8 +0x54$編輯:要點:“主 goroutine 被阻塞,因此所有 goroutine 都被阻塞,因此這是一個死鎖?!?在下面的代碼中,非主 goroutine 也被阻塞在通道上,不是所有的 goroutine 都應(yīng)該被阻塞嗎?package mainimport (    "fmt"    "time")func makeRandom(randoms chan int) {    var ch chan int    fmt.Printf("print 1\n")    <-ch    fmt.Printf("print 2\n")}func main() {    randoms := make(chan int)    go makeRandom(randoms)}編輯2:對于您在回答中的觀點:“并非所有的 goroutine 都被阻塞,所以這不是死鎖”。在下面的代碼中,只有main()goroutine 被阻塞,但沒有worker():package mainimport (    "fmt")func worker() {    fmt.Printf("some work\n")}func main() {    ch := make(chan int)    go worker()    <-ch}并且輸出顯示死鎖:$ bin/cs61a some workfatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.main()        /home/user/code/src/github.com/myhub/cs61a/Main.go:18 +0x6f$理想情況下main()不應(yīng)該退出,因為通道資源被任何一個 go-routine 使用。為什么通道上的 go-routine 阻塞被認(rèn)為是死鎖?
查看完整描述

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 才算。


查看完整回答
反對 回復(fù) 2022-06-01
?
慕婉清6462132

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 之前無法釋放。


查看完整回答
反對 回復(fù) 2022-06-01
  • 2 回答
  • 0 關(guān)注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號