Go语言的sync.Cond
类型是专门用于线程同步的条件变量。它允许一个或多个goroutine等待某个条件成立,同时释放互斥锁(sync.Mutex
),让其他goroutine继续执行。当条件满足时,等待的goroutine会被唤醒并重新获取互斥锁。
下面是一个简单的示例,展示了如何使用sync.Cond
进行线程同步:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var mu sync.Mutex
cond := sync.NewCond(&mu)
data := 0
for i := 0; i < 10; i++ {
mu.Lock()
for data <= 0 {
cond.Wait()
}
data--
fmt.Printf("Goroutine %d: Data is %d\n", i, data)
cond.Signal()
mu.Unlock()
time.Sleep(1 * time.Second)
}
}
在这个示例中,我们创建了一个互斥锁mu
和一个条件变量cond
。我们使用一个循环来模拟10个goroutine,每个goroutine在data
大于0时执行。当一个goroutine发现data
小于等于0时,它会调用cond.Wait()
进入等待状态,并释放互斥锁。当条件满足(即data
大于0)时,其他goroutine会被唤醒并继续执行。