Sry这个标题可能会产生误导。实际上,完整的代码如下:
package main
import (
"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()
}
当我注释一些行并再次运行它时,它会抛出一个致命错误
订阅函数更改如下所示:"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()
}
让我感到困惑的是,是否在外部函数返回之前执行。在我看来,尽管外部函数已返回,但 will 将作为守护程序运行,因此该变量是不必要的。但这表明我完全错了。因此,如果 有可能不被调度,这是否意味着我们必须在每个函数或代码块中使用 in,以确保在函数或代码块返回之前调度 goroutine 执行?
谢谢大家。go funcsubscribego funcwggo funcsync.WaitGroup
拉风的咖菲猫
手掌心
相关分类