亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

Go語言條件變量怎樣避免忙等

小樊
82
2024-11-02 16:28:30
欄目: 編程語言

在Go語言中,為了避免忙等(busy waiting),我們可以使用sync.Cond來實現條件變量。sync.Cond是一個基于sync.Mutex的條件變量,它允許我們在特定條件下等待,同時釋放互斥鎖,讓其他goroutine繼續執行。當條件滿足時,sync.Cond會自動喚醒等待的goroutine。

下面是一個使用sync.Cond避免忙等的示例:

package main

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

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

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

func (d *Data) WaitForValue(target int) {
	d.cond.L.Lock() // 獲取互斥鎖
	for d.value != target {
		d.cond.Wait() // 等待條件滿足
	}
	fmt.Println("Condition met:", d.value)
	d.cond.L.Unlock() // 釋放互斥鎖
}

func (d *Data) SetValue(value int) {
	d.cond.L.Lock() // 獲取互斥鎖
	d.value = value
	d.cond.Signal() // 喚醒等待的goroutine
	d.cond.L.Unlock() // 釋放互斥鎖
}

func main() {
	data := NewData()

	go func() {
		time.Sleep(2 * time.Second) // 模擬一些初始化工作
		data.SetValue(10)
	}()

	data.WaitForValue(10)
}

在這個示例中,我們創建了一個Data結構體,它包含一個整數值和一個條件變量。WaitForValue方法用于等待條件滿足,SetValue方法用于設置條件值并喚醒等待的goroutine。通過使用sync.Cond,我們可以避免忙等,因為cond.Wait()會自動釋放互斥鎖,讓其他goroutine繼續執行。當條件滿足時,sync.Cond會自動喚醒等待的goroutine。

0
苗栗县| 鄂托克旗| 天津市| 疏勒县| 合山市| 蒙自县| 波密县| 岳阳县| 景洪市| 乐业县| 厦门市| 新建县| 泗洪县| 景谷| 西峡县| 舒兰市| 佛教| 长沙县| 荃湾区| 铜梁县| 玉屏| 宝山区| 木里| 临安市| 濉溪县| 桂阳县| 九寨沟县| 大安市| 通渭县| 汾阳市| 榆树市| 苍南县| 延吉市| 永修县| 二连浩特市| 宜川县| 贡嘎县| 昭觉县| 大余县| 成安县| 轮台县|