前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go-标准库-sync(三)

Go-标准库-sync(三)

原创
作者头像
堕落飞鸟
发布2023-04-22 08:55:53
1390
发布2023-04-22 08:55:53
举报
文章被收录于专栏:飞鸟的专栏

条件变量(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 执行完成。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 条件变量(Cond)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档