栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

示例对sync.WaitGroup正确吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

示例对sync.WaitGroup正确吗?

是的,这个例子是正确的。重要的是在声明

wg.Add()
之前发生该事件
go
以防止出现种族状况。以下内容也是正确的:

func main() {    var wg sync.WaitGroup    wg.Add(1)    go dosomething(200, &wg)    wg.Add(1)    go dosomething(400, &wg)    wg.Add(1)    go dosomething(150, &wg)    wg.Add(1)    go dosomething(600, &wg)    wg.Wait()    fmt.Println("Done")}

但是,

wg.Add
当您已经知道将被调用多少次时,反复调用是没有意义的。


Waitgroups
如果计数器降到零以下则恐慌。计数器从零开始,每个
Done()
为a
-1
,每个
Add()
取决于参数。所以,为了保证计数器不会低于,避免恐慌,需要
Add()
进行 担保 来之前
Done()

在Go中,这种保证由内存模型给出。

内存模型指出,单个goroutine中的所有语句似乎都按照与编写时相同的顺序执行。他们有可能实际上并不是按照这个顺序排列的,但结果似乎是这样。还可以确保goroutine直到

go
调用它的语句之后才运行。由于
Add()
发生在
go
语句之前,且
go
发生在语句之前
Done()
,我们知道
Add()
发生在语句之前
Done()

如果要让该

go
语句位于之前
Add()
,则该程序可能会正确运行。但是,这将是一种竞赛条件,因为无法保证。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/397912.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号