Source File
cond.go
Belonging Package
sync
// Copyright 2011 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.package syncimport ()// Cond implements a condition variable, a rendezvous point// for goroutines waiting for or announcing the occurrence// of an event.//// Each Cond has an associated Locker L (often 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).//// For more on replacements for sync.Cond, see [Roberto Clapis's series on// advanced concurrency patterns], as well as [Bryan Mills's talk on concurrency// patterns].//// [Roberto Clapis's series on advanced concurrency patterns]: https://blogtitle.github.io/categories/concurrency/// [Bryan Mills's talk on concurrency patterns]: https://drive.google.com/file/d/1nPdvhB0PutEJzdCq5ms6UI58dp50fcAN/viewtype Cond struct {noCopy noCopy// L is held while observing or changing the conditionL Lockernotify notifyListchecker copyChecker}// NewCond returns a new Cond with Locker l.func ( Locker) *Cond {return &Cond{L: }}// Wait atomically unlocks c.L and suspends execution// of the calling goroutine. After later resuming execution,// Wait locks c.L before returning. Unlike in other systems,// Wait cannot return unless awoken by Broadcast or Signal.//// Because c.L is not locked while Wait is waiting, the caller// typically cannot assume that the condition is true when// Wait returns. Instead, the caller should Wait in a loop://// c.L.Lock()// for !condition() {// c.Wait()// }// ... make use of condition ...// c.L.Unlock()func ( *Cond) () {.checker.check():= runtime_notifyListAdd(&.notify).L.Unlock()runtime_notifyListWait(&.notify, ).L.Lock()}// Signal wakes one goroutine waiting on c, if there is any.//// It is allowed but not required for the caller to hold c.L// during the call.//// Signal() does not affect goroutine scheduling priority; if other goroutines// are attempting to lock c.L, they may be awoken before a "waiting" goroutine.func ( *Cond) () {.checker.check()runtime_notifyListNotifyOne(&.notify)}// Broadcast wakes all goroutines waiting on c.//// It is allowed but not required for the caller to hold c.L// during the call.func ( *Cond) () {.checker.check()runtime_notifyListNotifyAll(&.notify)}// copyChecker holds back pointer to itself to detect object copying.type copyChecker uintptrfunc ( *copyChecker) () {if uintptr(*) != uintptr(unsafe.Pointer()) &&!atomic.CompareAndSwapUintptr((*uintptr)(), 0, uintptr(unsafe.Pointer())) &&uintptr(*) != uintptr(unsafe.Pointer()) {panic("sync.Cond is copied")}}// noCopy may be added to structs which must not be copied// after the first use.//// See https://golang.org/issues/8005#issuecomment-190753527// for details.//// Note that it must not be embedded, due to the Lock and Unlock methods.type noCopy struct{}// Lock is a no-op used by -copylocks checker from `go vet`.func (*noCopy) () {}func (*noCopy) () {}
![]() |
The pages are generated with Golds v0.6.7. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |