Go Cond: Difference between revisions
Line 7: | Line 7: | ||
<code>Cond</code> implements a '''condition variable''', a rendezvous point for goroutines waiting for or announcing the occurrence of an event. In this definition, an "event" is an arbitrary signal between two or more goroutines that carries no information other than the fact that it has occurred. <code>Cond</code> offers a way for a goroutine to "efficiently sleep" (be suspended) until it is signaled to wake up and check of a condition. | <code>Cond</code> implements a '''condition variable''', a rendezvous point for goroutines waiting for or announcing the occurrence of an event. In this definition, an "event" is an arbitrary signal between two or more goroutines that carries no information other than the fact that it has occurred. <code>Cond</code> offers a way for a goroutine to "efficiently sleep" (be suspended) until it is signaled to wake up and check of a condition. | ||
The typical usage pattern is described below: | |||
In the terminology of the Go memory model, <code>Cond</code> arranges that a call to <code>Broadcast()</code> or <code>Signal()</code> "synchronizes before" any <code>Wait</code> call that it unblocks. For many simple use cases, users will be better off using channels than a <code>Cond</code> (<code>Broadcast()</code> corresponds to closing a channel, and <code>Signal</code> corresponds to sending on a channel). | Each goroutine that wants to access condition, concurrently, uses this access pattern: | ||
<syntaxhighlight lang='go'> | |||
cond.L.Lock() | |||
for !condition() { | |||
c.Wait() // Wait() releases the lock internally, as a side effect | |||
} | |||
// at this point the goroutine has exclusive access to the condition | |||
// make use of the condition | |||
c.L.Unlock() | |||
</syntaxhighlight> | |||
Each <code>Cond</code> has an associated <code>Locker</code> <code>L</code>, commonly a <code>*Mutex</code> or <code>*RWMutex</code>, which must be held when changing the condition and when calling the <code>Wait</code> method. A <code>Cond</code> must not be copied after first use. In the terminology of the Go memory model, <code>Cond</code> arranges that a call to <code>Broadcast()</code> or <code>Signal()</code> "synchronizes before" any <code>Wait</code> call that it unblocks. For many simple use cases, users will be better off using channels than a <code>Cond</code> (<code>Broadcast()</code> corresponds to closing a channel, and <code>Signal</code> corresponds to sending on a channel). |
Revision as of 21:57, 20 January 2024
External
Internal
Overview
Cond
implements a condition variable, a rendezvous point for goroutines waiting for or announcing the occurrence of an event. In this definition, an "event" is an arbitrary signal between two or more goroutines that carries no information other than the fact that it has occurred. Cond
offers a way for a goroutine to "efficiently sleep" (be suspended) until it is signaled to wake up and check of a condition.
The typical usage pattern is described below:
Each goroutine that wants to access condition, concurrently, uses this access pattern:
cond.L.Lock()
for !condition() {
c.Wait() // Wait() releases the lock internally, as a side effect
}
// at this point the goroutine has exclusive access to the condition
// make use of the condition
c.L.Unlock()
Each Cond
has an associated Locker
L
, commonly a *Mutex
or *RWMutex
, which must be held when changing the condition and when calling the Wait
method. A Cond
must not be copied after first use. In the terminology of the Go memory model, Cond
arranges that a call to Broadcast()
or Signal()
"synchronizes before" any Wait
call that it unblocks. For many simple use cases, users will be better off using channels than a Cond
(Broadcast()
corresponds to closing a channel, and Signal
corresponds to sending on a channel).