Go-标准库-sync(三)

2023-04-22 08:55:53 浏览数 (1)

条件变量(Cond)

条件变量(Cond)是 sync 包中用于等待和通知 goroutine 的机制。条件变量需要和互斥锁配合使用,常用于等待某个条件达成的情况下,通知其它 goroutine 可以继续执行。条件变量有两个主要的方法:Wait()Signal()Wait() 方法用于等待条件变量的通知,会自动释放互斥锁,并将当前 goroutine 挂起;Signal() 方法用于通知等待在条件变量上的一个 goroutine 可以继续执行,如果没有等待的 goroutine,则该通知会被忽略。

下面是一个条件变量的示例代码:

代码语言:javascript复制
package main

import (
	"fmt"
	"sync"
)

var count int
var cond *sync.Cond

func increment() {
	cond.L.Lock()
	defer cond.L.Unlock()
	count  
	if count == 10 {
		cond.Signal()
	}
}

func main() {
	cond = sync.NewCond(&sync.Mutex{})
	var wg sync.WaitGroup
	for i := 0; i < 10; i   {
		wg.Add(1)
		go func() {
			defer wg.Done()
			increment()
		}()
	}
	cond.L.Lock()
	defer cond.L.Unlock()
	cond.Wait()
	fmt.Println("Count is 10 now!")
	wg.Wait()
}

在上面的示例代码中,我们定义了一个全局变量 count 和一个条件变量 condincrement() 函数用于将 count 加 1,并在 count 变成 10 时通知等待在 cond 上的 goroutine 可以继续执行。在 main() 函数中,我们启动了 10 个 goroutine 来调用 increment() 函数,最后我们使用 Wait() 方法等待条件变量的通知。当 count 变成 10 时,increment() 函数会调用 Signal() 方法通知等待在 cond 上的 goroutine 可以继续执行,然后我们打印出 "Count is 10 now!",最后使用 wg.Wait() 等待所有的 goroutine 执行完成。

go

0 人点赞