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

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

為什么Go函數(shù)中的go func需要等待組才能正確退出?

為什么Go函數(shù)中的go func需要等待組才能正確退出?

Go
蝴蝶刀刀 2022-09-05 09:26:58
Sry這個標題可能會產(chǎn)生誤導。實際上,完整的代碼如下:package mainimport (    "fmt"    "sync")type Button struct {    Clicked *sync.Cond}func main() {    button := Button{        Clicked: sync.NewCond(&sync.Mutex{}),    }    subscribe := func(c *sync.Cond, fn func()) {        var wg sync.WaitGroup        wg.Add(1)        go func() {            wg.Done()            c.L.Lock()            defer c.L.Unlock()            c.Wait()            fn()        }()        wg.Wait()    }    var clickRegistered sync.WaitGroup    clickRegistered.Add(2)    subscribe(button.Clicked, func() {        fmt.Println("maximizing window")        clickRegistered.Done()    })    subscribe(button.Clicked, func() {        fmt.Println("displaying dialog")        clickRegistered.Done()    })    button.Clicked.Broadcast()    clickRegistered.Wait()}當我注釋一些行并再次運行它時,它會拋出一個致命錯誤訂閱函數(shù)更改如下所示:"all goroutines are asleep - deadlock!"subscribe := func(c *sync.Cond, fn func()) {        //var wg sync.WaitGroup        //wg.Add(1)        go func() {            //wg.Done()            c.L.Lock()            defer c.L.Unlock()            c.Wait()            fn()        }()        //wg.Wait()    }讓我感到困惑的是,是否在外部函數(shù)返回之前執(zhí)行。在我看來,盡管外部函數(shù)已返回,但 will 將作為守護程序運行,因此該變量是不必要的。但這表明我完全錯了。因此,如果 有可能不被調(diào)度,這是否意味著我們必須在每個函數(shù)或代碼塊中使用 in,以確保在函數(shù)或代碼塊返回之前調(diào)度 goroutine 執(zhí)行?謝謝大家。go funcsubscribego funcwggo funcsync.WaitGroup
查看完整描述

2 回答

?
拉風的咖菲貓

TA貢獻1995條經(jīng)驗 獲得超2個贊

問題是,在任何一個調(diào)用中都不能保證在之前運行;甚至你的原始代碼的使用也不能保證它(因為它是重要的部分,而不是goroutine的生成)c.Wait()button.Clicked.Broadcast()WaitGroupc.Wait()


修改訂閱:


subscribe := func(c *sync.Cond, subWG *sync.WaitGroup, fn func()) {

        go func() {

            c.L.Lock()

            defer c.L.Unlock()

            subWG.Done() // [2]

            c.Wait()

            fn()

        }()

    }

等待代碼:


subWG.Done()

button.Clicked.L.Lock()

button.Clicked.L.Unlock()

這是基于這樣的觀察,這種觀察只能在開始時發(fā)生,或者發(fā)生在所有先前執(zhí)行的goroutines都堅持之后,由于它們共享的儲物柜。因此,這意味著(或訂閱數(shù)量)被執(zhí)行,只有一個goroutine沒有堅持下去,這可以通過要求將儲物柜到另一個時間來解決。[2][2]c.WaitsubWG.Wait()2[2]c.WaitLock


游樂場: https://play.golang.org/p/6mjUEcn3ec5


查看完整回答
反對 回復 2022-09-05
?
手掌心

TA貢獻1942條經(jīng)驗 獲得超3個贊

使用等待組(在當前組中編碼):當函數(shù)返回時,您知道等待的goroutine至少已經(jīng)開始執(zhí)行。wgsubscribe

因此,當您的主要功能達到時,很有可能兩個goroutine實際上正在等待他們的呼叫。button.Clicked.Broadcast()button.Clicked.Wait()

如果沒有 ,則無法保證 goroutines 甚至已啟動,并且您的代碼可能調(diào)用得太快。wgbutton.Clicked.Broadcast()


請注意,使用 它只是降低了死鎖發(fā)生的可能性,但它不會在所有情況下阻止死鎖。wg

嘗試編譯你的二進制文件,并在循環(huán)中運行它(例如從bash :),我想你會看到同樣的問題有時會發(fā)生。-racefor i in {1..100}; do ./myprogram; done


查看完整回答
反對 回復 2022-09-05
  • 2 回答
  • 0 關(guān)注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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