Because the wait on the condition is in another Go routine, so the the Broadcast occurs before all of the routines are waiting. Broadcast only wakes up currently waiting routines.
> On Jul 18, 2024, at 9:01 AM, Lammie Jonson <jrubia...@gmail.com> wrote: > > // I am not sure why this code sometimes deadlocks, but sometimes it doesn't. > // Hopefully someone will have some suggestions > > package main > > // ??? sometimes deadlocks > > import ( > "fmt" > "sync" > "time" > ) > > type Button struct { > Clicked *sync.Cond > } > > func main() { > button := Button{ > Clicked: sync.NewCond(&sync.Mutex{}), > } > > // running on goroutine every function that passed/registered > // and wait, not exit until that goroutine is confirmed to be running > subscribe := func(c *sync.Cond, param string, fn func(s string)) { > var goroutineRunning sync.WaitGroup > var cnt = 0 > cnt = cnt + 1 > > fmt.Println("cnt:", cnt) > goroutineRunning.Add(1) > > go func(p string) { > goroutineRunning.Done() > c.L.Lock() // critical section > defer c.L.Unlock() > > fmt.Println("Registered and wait ... ") > // HANG SPOT: can hang here > c.Wait() > fmt.Println("afer goroutine wait for:", param) > > fn(p) > }(param) > fmt.Println("call wait before goroutine exit") > goroutineRunning.Wait() > fmt.Println("after wait, subscribe exits") > } > > var clickRegistered sync.WaitGroup > > for _, v := range []string{ > "Maximizing window.", > "Displaying annoying dialog box!", > "Mouse clicked."} { > > clickRegistered.Add(1) > > subscribe(button.Clicked, v, func(s string) { > fmt.Println(s, "****************************") > clickRegistered.Done() > }) > } > > fmt.Println("broadcast") > // is supposed to get the goroutines past HANG SPOT > button.Clicked.Broadcast() > time.Sleep(4000 * time.Millisecond) > > clickRegistered.Wait() > } > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com > <mailto:golang-nuts+unsubscr...@googlegroups.com>. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/d8148ef1-4d56-4b0b-a2d8-2992abe7a6c2n%40googlegroups.com > > <https://groups.google.com/d/msgid/golang-nuts/d8148ef1-4d56-4b0b-a2d8-2992abe7a6c2n%40googlegroups.com?utm_medium=email&utm_source=footer>. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/BCE619ED-241A-4239-99E2-D8C20994EB0A%40ix.netcom.com.