在Go語(yǔ)言中,我們可以使用sync.Cond
來(lái)實(shí)現(xiàn)條件變量的等待功能。sync.Cond
是一個(gè)條件變量,它可以幫助我們?cè)跐M足某個(gè)條件時(shí)阻塞當(dāng)前goroutine,直到其他goroutine通知它條件已經(jīng)滿足。
下面是一個(gè)簡(jiǎn)單的示例,展示了如何使用sync.Cond
實(shí)現(xiàn)等待功能:
package main
import (
"fmt"
"sync"
"time"
)
type Example struct {
cond *sync.Cond
data int
}
func NewExample() *Example {
return &Example{
cond: sync.NewCond(&sync.Mutex{}),
}
}
func (e *Example) WaitUntilDataGreaterThan(target int) {
e.cond.L.Lock() // 加鎖
for e.data <= target {
e.cond.Wait() // 等待條件滿足
}
e.cond.L.Unlock() // 解鎖
}
func (e *Example) SetData(value int) {
e.cond.L.Lock() // 加鎖
e.data = value
e.cond.Signal() // 通知等待的goroutine條件已經(jīng)滿足
e.cond.L.Unlock() // 解鎖
}
func main() {
example := NewExample()
go func() {
time.Sleep(2 * time.Second) // 模擬一些工作
example.SetData(5) // 設(shè)置數(shù)據(jù)為5
}()
example.WaitUntilDataGreaterThan(4) // 等待數(shù)據(jù)大于4
fmt.Println("Data is greater than 4")
}
在這個(gè)示例中,我們創(chuàng)建了一個(gè)名為Example
的結(jié)構(gòu)體,它包含一個(gè)sync.Cond
類型的字段cond
和一個(gè)整數(shù)字段data
。WaitUntilDataGreaterThan
方法用于等待數(shù)據(jù)大于指定值,SetData
方法用于設(shè)置數(shù)據(jù)并通知等待的goroutine條件已經(jīng)滿足。
在main
函數(shù)中,我們創(chuàng)建了一個(gè)Example
實(shí)例,并啟動(dòng)一個(gè)goroutine來(lái)模擬一些工作。在這個(gè)goroutine中,我們等待2秒后設(shè)置數(shù)據(jù)為5。在主goroutine中,我們調(diào)用WaitUntilDataGreaterThan
方法等待數(shù)據(jù)大于4。當(dāng)數(shù)據(jù)被設(shè)置為5時(shí),條件滿足,WaitUntilDataGreaterThan
方法返回,程序輸出"Data is greater than 4"。