示例对sync.WaitGroup正确吗?

示例对sync.WaitGroup正确吗?,第1张

示例对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()
,则该程序可能会正确运行。但是,这将是一种竞赛条件,因为无法保证。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5001505.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-14
下一篇2022-11-14

发表评论

登录后才能评论

评论列表(0条)

    保存