Go语言并发编程中 Cond 是什么

发布于 1周前 作者 phonegap100 最后一次编辑是 5天前 来自 问答

Go语言并发编程中 Cond 是什么

Cond 实现了一种条件变量,可以使用在多个 Reader 等待共享资源ready 的场 景(如果只有一读一写,一个锁或者 channel 就搞定了)

每个 Cond 都会关联一个 Lock(*sync.Mutex or *sync.RWMutex),当修改条 件或者调用 Wait 方法时,必须加锁,保护 condition。

1 回复

在Go语言的并发编程中,Cond 是一个与互斥锁(sync.Mutex)结合使用的条件变量,用于阻塞一个或多个goroutine,直到接收到另一个goroutine的通知或广播。它允许goroutine在特定条件不满足时暂停执行,并在条件变为真时继续执行。这通常用于同步多个goroutine之间的操作,特别是在等待或通知某些事件发生时。

Cond 结构体定义在 sync 包中,但需要注意的是,Cond 类型的值必须通过 sync.NewCond(&m) 来创建,其中 m 是一个指向 sync.Mutexsync.RWMutex 的指针,用于保护条件变量所依赖的条件。

下面是一个使用 Cond 的简单示例,展示了如何使用条件变量来同步goroutines:

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var mu sync.Mutex
	cond := sync.NewCond(&mu)
	var ready bool = false

	// 等待者
	go func() {
		mu.Lock()
		defer mu.Unlock()
		for !ready {
			cond.Wait() // 等待条件变为真
		}
		fmt.Println("Ready now!")
	}()

	// 通知者
	time.Sleep(1 * time.Second) // 模拟一些工作
	mu.Lock()
	ready = true
	cond.Signal() // 通知等待者条件已满足
	mu.Unlock()

	// 注意:在实际应用中,你可能需要更复杂的逻辑来确保等待者不会在通知之前退出
	// 或者使用Broadcast()来通知所有等待者
}

在这个示例中,有一个等待者goroutine,它等待 ready 变量变为 true。在等待条件满足之前,goroutine会调用 cond.Wait() 阻塞自己,并释放互斥锁。当 ready 变为 true 并且 cond.Signal() 被调用时,一个等待的goroutine(如果有的话)会被唤醒,并重新尝试获取互斥锁以继续执行。

注意,cond.Wait() 必须在持有与 Cond 关联的互斥锁的情况下调用,并且它会在调用之前自动释放锁,在返回之前重新获取锁。这确保了条件检查和条件等待的原子性。

此外,如果有多于一个的goroutine在等待同一个条件变量,那么 cond.Signal() 会随机唤醒一个等待的goroutine,而 cond.Broadcast() 会唤醒所有等待的goroutine。

回到顶部