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

TA貢獻1942條經(jīng)驗 獲得超3個贊
使用等待組(在當前組中編碼):當函數(shù)返回時,您知道等待的goroutine至少已經(jīng)開始執(zhí)行。wg
subscribe
因此,當您的主要功能達到時,很有可能兩個goroutine實際上正在等待他們的呼叫。button.Clicked.Broadcast()
button.Clicked.Wait()
如果沒有 ,則無法保證 goroutines 甚至已啟動,并且您的代碼可能調(diào)用得太快。wg
button.Clicked.Broadcast()
請注意,使用 它只是降低了死鎖發(fā)生的可能性,但它不會在所有情況下阻止死鎖。wg
嘗試編譯你的二進制文件,并在循環(huán)中運行它(例如從bash :),我想你會看到同樣的問題有時會發(fā)生。-race
for i in {1..100}; do ./myprogram; done
- 2 回答
- 0 關(guān)注
- 86 瀏覽
添加回答
舉報