以下是一个使用 Go sync.Cond 的简单代码示例:
package main
import (
"sync"
"fmt"
)
func main() {
var mu sync.Mutex
cond := sync.NewCond(&mu)
go func() {
for {
// 等待条件成立
cond.L.Lock()
cond.Wait()
fmt.Println("Goroutine 1: Condition is true!")
cond.L.Unlock()
}
}()
go func() {
for {
// 等待 1 秒
time.Sleep(1 * time.Second)
// 修改共享变量
mu.Lock()
fmt.Println("Goroutine 2: Condition is now true!")
cond.Signal() // 发送信号通知条件成立
mu.Unlock()
}
}()
// 等待 10 秒,观察输出
time.Sleep(10 * time.Second)
}
在此示例中,我们创建了一个互斥锁和一个条件变量(cond
)。我们创建了两个 goroutine,其中一个等待条件成立,另一个则会修改共享变量并通知条件成立。在主函数中,我们等待 10 秒钟,以便观察输出。
示例中的第一个 goroutine 在进入无限循环后,会等待满足条件变量。使用 cond.Wait()
函数,这个 goroutine 会释放互斥锁,等待条件变量满足之后再继续执行。一旦满足条件,goroutine 会被唤醒,并继续执行相应的操作。
第二个 goroutine 在等待 1 秒后,会获取互斥锁,修改共享变量,然后使用 cond.Signal()
函数发出信号,通知其他的 goroutine 条件已经满足。此时第一个 goroutine 被唤醒,输出一条消息,然后重新等待条件满足。
总之,这个示例演示了如何使用 Go sync.Cond 实现线程同步,以等待某些条件满足。