溫馨提示×

Go語言條件變量如何處理通知

小樊
81
2024-11-02 16:43:31
欄目: 編程語言

在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)的操作。

0