sync.WaitGroup Add( ) 用法

使用sync.WaitGroup来实现并发任务的同步。
image
Done()通常在函数内使用defer wg.Done()调用。add()学习是我通常也放在函数内,今天我发现在函数内调用会出现问题,主进程会先执行,比如如下代码,会出现问题。

package main

import (
	"fmt"
	"sync"
)

var n int
var wg sync.WaitGroup

func f1() {
	defer wg.Done()
	wg.Add(1)
	for i := 0; i < 1000; i++ {
		n = n + 1
	}
	fmt.Println("f1", n)
}
func f2() {
	defer wg.Done()
	wg.Add(1)
	for i := 0; i < 1000; i++ {
		n = n + 1
	}
	fmt.Println("f2", n)
}
func main() {
	//wg.Add(2)
	go f1()
	go f2()
	wg.Wait()
	fmt.Println("main:", n)
}

执行结果如下

image

把代码修改一下,即可


import (
	"fmt"
	"sync"
)

var n int
var wg sync.WaitGroup

func f1() {
	defer wg.Done()
	//wg.Add(1)
	for i := 0; i < 1000; i++ {
		n = n + 1
	}
	fmt.Println("f1", n)
}
func f2() {
	defer wg.Done()
	//wg.Add(1)
	for i := 0; i < 1000; i++ {
		n = n + 1
	}
	fmt.Println("f2", n)
}
func main() {
	wg.Add(2)
	go f1()
	go f2()
	wg.Wait()
	fmt.Println("main:", n)
}

执行结果如下

image

综上,Add()函数放到外面比较好,防止出现冲突。

posted @   熟稔于纸  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示