Lost Wakeups happens when a thread goes to sleep and the wakeup signal is sent right before it sleeps so it misses it and sleeps forever.
This issue is due to the gap between sending the wakeup signal and the thread going into sleep.
Solution: Make sending the signal and going to sleep mutually exclusive using a lock/mutex.
This is why in Go, we usually initialise conditional variables with a mutex.
var mu sync.Mutex
cond := sync.NewCond(&mu)