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.

Reply via email to