Go语言并发编程-sync包中WaitGroup

并发进程同步工具-WaitGroup

使用等待组进行多个任务的同步,等待组可以保证在并发环境中完成指定数量的任务
等待组的方法:

方法名功能
(wg *WaitGroup)Add(delta int)等待组的计数器+1
(wg *WaitGroup)Done()等待组的计数器-1
(wg *WaitGroup)Wait()当等待组计数器不等于0时阻塞,直到为0

以下代码实现了主协程与两个子协程,两者之间的同步

package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup
func main(){
	/*
	WaitGroup :同步等待组
		Add(),设置等待组中要执行的子goroutine的数量

		Wait(),让主goroutine处于等待
		
		Done(),等待组计数器减-1
		注意,如果Add中的值最后减不到0,那么程序就会引发panic(恐慌)
	 */
	wg.Add(2)
	go fun1()
	go fun2()

	
	fmt.Println("main 进入阻塞状态,等待wg中的子goroutine结束。")
	wg.Wait()
	fmt.Println("main 解除阻塞")
}

func fun1(){
	for i:=1;i<10;i++{
		fmt.Println("fun1()函数中打印。。。A",i)
	}
	wg.Done()


}
func fun2(){
	defer wg.Done()
	for i:=1;i<10;i++{
		fmt.Println("fun2()函数中打印。。。B",i)
	}
}

控制台输出:

main 进入阻塞状态,等待wg中的子goroutine结束。
fun2()函数中打印。。。B 1
fun1()函数中打印。。。A 1
fun1()函数中打印。。。A 2
fun1()函数中打印。。。A 3
fun1()函数中打印。。。A 4
fun1()函数中打印。。。A 5
fun1()函数中打印。。。A 6
fun1()函数中打印。。。A 7
fun1()函数中打印。。。A 8
fun1()函数中打印。。。A 9
fun2()函数中打印。。。B 2
fun2()函数中打印。。。B 3
fun2()函数中打印。。。B 4
fun2()函数中打印。。。B 5
fun2()函数中打印。。。B 6
fun2()函数中打印。。。B 7
fun2()函数中打印。。。B 8
fun2()函数中打印。。。B 9
main 解除阻塞

注意,主线程执行第一条打印语句之后进入阻塞状态,等待等待组内的子协程执行完毕,之后又恢复主线程打印了主线程解除阻塞,程序结束。通过整个流程和打印结果我们可以看出,等待组实现了组与组之间的同步,组内之间仍然是交替抢占CPU时间片的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值