大佬教程收集整理的这篇文章主要介绍了示例对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()
,则该程序可能会正确运行。但是,这将是一种竞赛条件,因为无法保证。
此示例用法sync.WaitGroup
正确吗?它给出了预期的结果,但我不确定wg.Add(4)
的位置wg.Done()
。一次添加四个goroutIne是否有意义wg.Add()
?
http://play.golang.org/p/ecvYHiie0P
package main
import (
"fmt"
"sync"
"time"
)
func dosomething(millisecs time.Duration,wg *sync.WaitGroup) {
duration := millisecs * time.Millisecond
time.Sleep(duration)
fmt.Println("Function in BACkground,duration:",duration)
wg.Done()
}
func main() {
var wg sync.WaitGroup
wg.Add(4)
go dosomething(200,&wg)
go dosomething(400,&wg)
go dosomething(150,&wg)
go dosomething(600,&wg)
wg.Wait()
fmt.Println("Done")
}
结果(按预期):
Function in BACkground,duration: 150ms
Function in BACkground,duration: 200ms
Function in BACkground,duration: 400ms
Function in BACkground,duration: 600ms
Done
以上是大佬教程为你收集整理的示例对sync.WaitGroup正确吗?全部内容,希望文章能够帮你解决示例对sync.WaitGroup正确吗?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。