在Go語言中,條件變量通常使用sync.Cond
類型來實(shí)現(xiàn)。sync.Cond
是一個條件變量,它允許一組goroutine等待某個條件成立。當(dāng)條件發(fā)生變化時,可以使用Signal()
或Broadcast()
方法來通知等待的goroutine。
下面是一個簡單的示例,展示了如何使用sync.Cond
處理通知:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var mu sync.Mutex
cond := sync.NewCond(&mu)
data := 0
// 生產(chǎn)者goroutine
go func() {
for i := 0; i < 10; i++ {
mu.Lock()
for data <= i {
cond.Wait() // 等待條件成立
}
fmt.Printf("Producer: Data %d is ready\n", i)
data = i + 1
cond.Signal() // 通知消費(fèi)者goroutine
mu.Unlock()
time.Sleep(1 * time.Second)
}
}()
// 消費(fèi)者goroutine
go func() {
for i := 0; i < 10; i++ {
mu.Lock()
for data > i {
cond.Wait() // 等待條件成立
}
fmt.Printf("Consumer: Data %d is consumed\n", i)
mu.Unlock()
time.Sleep(1 * time.Second)
}
}()
time.Sleep(10 * time.Second)
}
在這個示例中,我們創(chuàng)建了一個sync.Cond
類型的條件變量cond
,以及一個互斥鎖mu
。生產(chǎn)者goroutine在數(shù)據(jù)大于等于某個值時,通過cond.Signal()
通知消費(fèi)者goroutine。消費(fèi)者goroutine在數(shù)據(jù)小于某個值時,通過cond.Wait()
等待條件成立。當(dāng)條件成立時,消費(fèi)者goroutine會被喚醒并處理數(shù)據(jù)。
注意:在使用cond.Wait()
時,需要確保已經(jīng)持有互斥鎖mu
,否則會導(dǎo)致運(yùn)行時錯誤。在喚醒等待的goroutine之前,也需要釋放互斥鎖,以便其他goroutine可以獲取鎖并執(zhí)行相應(yīng)的操作。