-
Notifications
You must be signed in to change notification settings - Fork 18.3k
Description
Sometimes condition variables are the best fit for a problem, and sometimes channels are. They don't compose well, though.
I've increasingly been finding myself in a position where I would like to select on both channel(s) and a condition variable. This has come up a few times in http2, where I use condition variables for flow control, but there are plenty of channels (including the net/http.Request.Cancel channel) in play too. Sometimes I need to both wait for flow control, or wait for a user to cancel their request, or the peer side to close their connection, etc.
I would love to be able to select on a condition variable, like if the sync.Cond
type had a method:
// WaitChan returns a channel which receives a value when awoken
// by Broadcast or Signal. Unlike Wait, WaitChan does not unlock
// or lock the c.L mutex.
func (c *Cond) WaitChan() <-chan struct{} {
// ....
}
The semantics would be the receiving from it acts like a runtime_Syncsemacquire
on c.sema
. We'd need to define what happens if another case in the select fires first. (does the semacquire get canceled?).
Thoughts?
Metadata
Metadata
Assignees
Labels
Type
Projects
Status