91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

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

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

在Go語言中,條件變量通常使用sync.Cond類型來實現。sync.Cond是一個條件變量,它允許一組goroutine等待某個條件成立。當條件發生變化時,可以使用Signal()Broadcast()方法來通知等待的goroutine。

下面是一個簡單的示例,展示了如何使用sync.Cond處理通知:

package main

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

func main() {
	var mu sync.Mutex
	cond := sync.NewCond(&mu)
	data := 0

	// 生產者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() // 通知消費者goroutine
			mu.Unlock()
			time.Sleep(1 * time.Second)
		}
	}()

	// 消費者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)
}

在這個示例中,我們創建了一個sync.Cond類型的條件變量cond,以及一個互斥鎖mu。生產者goroutine在數據大于等于某個值時,通過cond.Signal()通知消費者goroutine。消費者goroutine在數據小于某個值時,通過cond.Wait()等待條件成立。當條件成立時,消費者goroutine會被喚醒并處理數據。

注意:在使用cond.Wait()時,需要確保已經持有互斥鎖mu,否則會導致運行時錯誤。在喚醒等待的goroutine之前,也需要釋放互斥鎖,以便其他goroutine可以獲取鎖并執行相應的操作。

0
册亨县| 呼玛县| 黑龙江省| 卢湾区| 佛坪县| 仪陇县| 华阴市| 德保县| 云梦县| 汪清县| 伊宁市| 安龙县| 武宁县| 新竹市| 凭祥市| 孝义市| 庆城县| 沂源县| 黑河市| 岑巩县| 昌黎县| 明溪县| 宜宾市| 精河县| 香格里拉县| 平乡县| 石楼县| 和平区| 昌图县| 平谷区| 布尔津县| 中卫市| 玛纳斯县| 高陵县| 中江县| 龙口市| 曲沃县| 大理市| 固镇县| 凉城县| 纳雍县|