Go語(yǔ)言條件變量如何簡(jiǎn)化邏輯

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

在Go語(yǔ)言中,條件變量通常使用sync.Cond來(lái)實(shí)現(xiàn)。sync.Cond是一個(gè)基于sync.Mutex的條件變量,它允許你在多個(gè)goroutine之間進(jìn)行同步。要簡(jiǎn)化條件變量的邏輯,你可以遵循以下步驟:

  1. 定義一個(gè)sync.Cond變量。
  2. 使用sync.Mutex來(lái)保護(hù)共享資源。
  3. 在需要等待條件滿(mǎn)足時(shí),使用cond.Wait()方法。
  4. 在條件發(fā)生變化時(shí),使用cond.Signal()cond.Broadcast()方法通知等待的goroutine。

下面是一個(gè)簡(jiǎn)單的示例,展示了如何使用sync.Cond簡(jiǎn)化條件變量的邏輯:

package main

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

type Data struct {
	value int
	cond  *sync.Cond
	mu    sync.Mutex
}

func NewData() *Data {
	return &Data{
		cond: sync.NewCond(&sync.Mutex{}),
	}
}

func (d *Data) Increment() {
	d.mu.Lock()
	defer d.mu.Unlock()

	d.value++
	fmt.Println("Value incremented to:", d.value)

	// 通知等待的goroutine條件已滿(mǎn)足
	d.cond.Signal()
}

func (d *Data) WaitForValue(targetValue int) {
	d.mu.Lock()
	defer d.mu.Unlock()

	// 等待條件滿(mǎn)足
	for d.value < targetValue {
		d.cond.Wait()
	}

	fmt.Println("Value reached:", d.value)
}

func main() {
	data := NewData()

	go func() {
		for i := 0; i < 5; i++ {
			time.Sleep(1 * time.Second)
			data.Increment()
		}
	}()

	data.WaitForValue(5)
}

在這個(gè)示例中,我們創(chuàng)建了一個(gè)Data結(jié)構(gòu)體,它包含一個(gè)整數(shù)值、一個(gè)條件變量和一個(gè)互斥鎖。Increment()方法用于遞增值并通知等待的goroutine,而WaitForValue()方法用于等待值達(dá)到目標(biāo)值。通過(guò)使用sync.Cond,我們可以簡(jiǎn)化條件變量的邏輯,使其更易于理解和維護(hù)。

0