Go语言-sync包中的WaitGroup使用实例

本文详细介绍了Go语言中WaitGroup的使用方法及其在并发控制中的作用。通过三个具体实例展示了如何利用WaitGroup确保所有goroutine执行完毕后再继续执行主线程,探讨了不同设置下输出结果的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WaitGroup

它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。

WaitGroup总共有三个方法

Add:添加或者减少等待goroutine的数量
Done:相当于Add(-1)
Wait:执行阻塞,直到所有的WaitGroup数量变成0

实践

实例1跟实例2代码区别:少了一行代码go func() {}()
实例1和实例3代码区别:runtime.GOMAXPROCS的入参不一样

实例1(顺序输出)
package main

import (
                "fmt"
                "sync"
                "runtime"
)

func main() {
                N := 26
                runtime.GOMAXPROCS(1)
                var waitGroup  sync.WaitGroup
                waitGroup.Add(2*N)
                for i := 1; i <= N; i++ {
                                go func(i int) {
                                                //defer waitGroup.Add(-1)
                                                defer waitGroup.Done()
                                                fmt.Printf("%c ", 96 + i)
                                }(i)
                }

                for i := 1; i <= N; i++ {
                                go func(i int)  {
                                                //defer waitGroup.Add(-1)
                                                defer waitGroup.Done()
                                                fmt.Printf("%c ", 64 + i)
                                }(i)
                }
                go func() {}()
                waitGroup.Wait()
}

运行结果

a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
实例2(除了最后一个字母,其他字符顺序输出)
package main

import (
                "fmt"
                "sync"
                "runtime"
)

func main() {
                N := 26
                runtime.GOMAXPROCS(1)
                var waitGroup  sync.WaitGroup
                waitGroup.Add(2*N)
                for i := 1; i <= N; i++ {
                                go func(i int) {
                                                //defer waitGroup.Add(-1)
                                                defer waitGroup.Done()
                                                fmt.Printf("%c ", 96 + i)
                                }(i)
                }

                for i := 1; i <= N; i++ {
                                go func(i int)  {
                                                //defer waitGroup.Add(-1)
                                                defer waitGroup.Done()
                                                fmt.Printf("%c ", 64 + i)
                                }(i)
                }
                //go func() {}()
                waitGroup.Wait()
}

运行结果
Z a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y

实例3(乱序输出)
package main

import (
                "fmt"
                "sync"
                "runtime"
)

func main() {
                N := 26
                runtime.GOMAXPROCS(2)
                var waitGroup  sync.WaitGroup
                waitGroup.Add(2*N)
                for i := 1; i <= N; i++ {
                                go func(i int) {
                                                //defer waitGroup.Add(-1)
                                                defer waitGroup.Done()
                                                fmt.Printf("%c ", 96 + i)
                                }(i)
                }

                for i := 1; i <= N; i++ {
                                go func(i int)  {
                                                //defer waitGroup.Add(-1)
                                                defer waitGroup.Done()
                                                runtime.Gosched()
                                                fmt.Printf("%c ", 64 + i)
                                }(i)
                }
                go func() {}()
                waitGroup.Wait()
}

运行结果

c a b q d e f g h i j k r l m s n t o u p v w x K y z L M T N U O P V Q W R X S Y C Z D A B H E I F J G 

转载于:https://blog.51cto.com/12880687/2129462

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值