Go語(yǔ)言條件變量怎樣實(shí)現(xiàn)等待

小樊
81
2024-11-02 16:42:32

在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"。

0