在 Go 中,可以使用 sync 包中的 Cond 来实现条件变量。下面是一个简单的示例:
package main
import (
"fmt"
"sync"
)
func main() {
var mutex sync.Mutex
condition := sync.NewCond(&mutex)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
mutex.Lock()
defer mutex.Unlock()
fmt.Println("Goroutine 1: Waiting for condition...")
condition.Wait()
fmt.Println("Goroutine 1: Condition received!")
}()
wg.Add(1)
go func() {
defer wg.Done()
mutex.Lock()
defer mutex.Unlock()
fmt.Println("Goroutine 2: Performing some work...")
// 模拟等待时间
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 2: Working...")
}
fmt.Println("Goroutine 2: Signaling condition...")
condition.Signal()
}()
wg.Wait()
fmt.Println("All goroutines completed")
}
在上述示例中,两个 goroutine 分别使用了相同的互斥锁 mutex
和条件变量 condition
。第一个 goroutine 等待条件,并通过 condition.Wait()
进入阻塞状态。第二个 goroutine 执行一些工作,然后通过 condition.Signal()
发送信号通知第一个 goroutine 条件已满足。
当运行此程序时,你将会看到第一个 goroutine 在接收到条件信号后继续执行并输出相关信息。
请注意,在实际应用中,需要确保在调用 Wait()
方法之前获取互斥锁,并在条件满足时释放锁,以避免死锁或竞态条件的发生。
内容由零声教学AI助手提供,问题来源于学员提问