在Go語言中,條件變量通常使用sync.Cond
類型來實現。sync.Cond
是一個條件變量,它允許一組goroutine等待某個條件成立。當條件發生變化時,可以使用Signal()
或Broadcast()
方法來通知等待的goroutine。
下面是一個簡單的示例,展示了如何使用sync.Cond
處理通知:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var mu sync.Mutex
cond := sync.NewCond(&mu)
data := 0
// 生產者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() // 通知消費者goroutine
mu.Unlock()
time.Sleep(1 * time.Second)
}
}()
// 消費者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)
}
在這個示例中,我們創建了一個sync.Cond
類型的條件變量cond
,以及一個互斥鎖mu
。生產者goroutine在數據大于等于某個值時,通過cond.Signal()
通知消費者goroutine。消費者goroutine在數據小于某個值時,通過cond.Wait()
等待條件成立。當條件成立時,消費者goroutine會被喚醒并處理數據。
注意:在使用cond.Wait()
時,需要確保已經持有互斥鎖mu
,否則會導致運行時錯誤。在喚醒等待的goroutine之前,也需要釋放互斥鎖,以便其他goroutine可以獲取鎖并執行相應的操作。