溫馨提示×

Go語言條件變量如何管理狀態(tài)

小樊
81
2024-11-02 16:48:30
欄目: 編程語言

在Go語言中,我們可以使用sync.Cond來實(shí)現(xiàn)條件變量的管理。sync.Cond是一個基于sync.Mutex的條件變量,它允許在滿足特定條件時通知等待的goroutine。下面是一個簡單的示例,展示了如何使用sync.Cond來管理狀態(tài):

package main

import (
	"fmt"
	"sync"
	"time"
)

type State struct {
	mu        sync.Mutex
	cond      *sync.Cond
	condition bool
}

func NewState() *State {
	s := &State{
		cond: sync.NewCond(&s.mu),
	}
	return s
}

func (s *State) SetCondition(condition bool) {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.condition = condition
	s.cond.Broadcast() // 通知所有等待的goroutine
}

func (s *State) WaitForCondition() {
	s.mu.Lock()
	defer s.mu.Unlock()

	for !s.condition {
		s.cond.Wait() // 等待條件滿足
	}
}

func main() {
	state := NewState()

	go func() {
		state.WaitForCondition()
		fmt.Println("Condition met!")
	}()

	time.Sleep(2 * time.Second)
	state.SetCondition(true)
}

在這個示例中,我們創(chuàng)建了一個名為State的結(jié)構(gòu)體,它包含一個互斥鎖mu和一個條件變量cond。我們還定義了一個SetCondition方法來設(shè)置條件并通知所有等待的goroutine,以及一個WaitForCondition方法來等待條件滿足。

main函數(shù)中,我們創(chuàng)建了一個State實(shí)例,并啟動一個goroutine來等待條件滿足。然后,我們在主線程中等待2秒后設(shè)置條件為true,這將通知等待的goroutine繼續(xù)執(zhí)行。

0