首页 > 其他分享 >sync.WaitGroup Add( ) 用法

sync.WaitGroup Add( ) 用法

时间:2023-07-10 16:22:55浏览次数:38  
标签:wg WaitGroup f2 fmt sync Add Println

使用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()函数放到外面比较好,防止出现冲突。

标签:wg,WaitGroup,f2,fmt,sync,Add,Println
From: https://www.cnblogs.com/zzx-blogs/p/17541479.html

相关文章

  • 传奇登录器 提示access violation at address的解决方法
     存取违规地址当提示出现accessviolationataddress 可以尝试以下方法解决   右击“我的电脑”。单击“属性”。 在“系统属性”中单击“高级”。 在“性能”中单击“设置”。 在“性能选项”中单击“数据执行保护”。 单击“添加”。选择要运行的......
  • 线程池addWorker执行流程(添加工作线程)
    1//添加工作线程2privatebooleanaddWorker(RunnablefirstTask,booleancore){3//对线程池状态的判断以及对工作线程数量的判断4//外层for循环的标识5retry:6for(;;){7//获取ctl值8intc......
  • Atcoder ARC159C Permutation Addition
    设\(s=\sum\limits_{i=1}^na_i\),考虑加上排列\(p\),那么\(s\leftarrows+\frac{n\times(n+1)}{2}\)。当有解时,因为\(a_i\)相等,所以有\(s\bmodn=0\)。考虑\(n\bmod2=1\)时,\(\frac{n\times(n+1)}{2}\bmodn=0\),所以\(s\bmodn=0\)时才会有解。......
  • 3. Q_ 对内联元素设置_padding_top_和_padding_bottom_是否会增加它的
    Q:对内联元素设置padding-top和padding-bottom是否会增加它的高度?(原题是Doessettingpadding-topandpadding-bottomonaninlineelementaddtoitsdimensions?)A:答案是不会。同上题比较纠结,不太明白这里的dimensions指的是到底是什么意思?放置一边,咱们来分析下。对于......
  • 动态库单独添加Address Sanitizer
    原文地址:https://www.cnblogs.com/liqinglucky/p/address-sanitizer-in-library.htmlAddressSanitizer集成的原理是在汇编过程中(参考:程序编译过程与运行时内存-liqinglucky-博客园(cnblogs.com))编译出.o文件时就将AddressSanitizer的运行时库替换malloc()/free()实现内存......
  • docker中测试Address Sanitizer
    原文地址:https://www.cnblogs.com/liqinglucky/p/address-sanitizer-in-docker.htmlDocker只是提供了一个运行环境,Docker里的程序集成AddressSanitizer与Linux环境编译相比并不需要做任何额外改动。源代码:liqinglucky/DockerHelloWorld-码云-开源中国(gitee.com)一、代码......
  • rsync 用法教程
    rsynczabbix_agentd.log [email protected]:/tmp--progresshttp://www.ruanyifeng.com/blog/2020/08/rsync.html#Debian$sudoapt-getinstallrsync#RedHat$sudoyuminstallrsync#ArchLinux$sudopacman-Srsyncr如果apt-get没有命令:----linux系统......
  • std::future、std::promise、std::packaged_task、std::async
    std::promisestd::promise:用于获取线程中变量的结果,如下:#include<iostream>#include<thread>#include<future>voidprintMessage(std::promise<std::string>&&prms,std::stringmessage){std::this_thread::sleep_for(std::chrono::sec......
  • asyncore用法:
    asyncore用法使用asyncore模块创建域套接字的示例:importasyncoreimportsocketclassEchoServer(asyncore.dispatcher):def__init__(self,address):asyncore.dispatcher.__init__(self)self.create_socket(socket.AF_UNIX,socket.SOCK_STREAM)......
  • maven 网关应用:[NACOS ConnectException httpPost] currentServerAddr: http://localh
    网关应用运行忽然报错:[NACOSConnectExceptionhttpPost]currentServerAddr:http://localhost:8848,虽然调整了代码逻辑,但是nacos的配置没有变更过,之前也还能正常跑,网上查了一些,有说是配置优先级的问题,说是Nacos默认的配置优先级最高,覆盖了本地了,但是我遇到的情况是虽然一直......