【发布时间】:2016-12-06 20:28:21
【问题描述】:
正如golang doc 中提到的,同步是针对低级库例程的。
除了Once 和WaitGroup 类型之外,大多数是供以下用户使用的 低级库例程。更高级别的同步更好 通过渠道和沟通完成。
我不太理解这个说法,我使用了如下示例所示的同步。
我的目的只是让主线程等待所有其他线程完成,类似于 c++ 线程库中的.join()。
问题:
1:这样使用同步合适吗?还是应该使用频道而不是同步?
2:频道和同步有什么区别?
var wg sync.WaitGroup // declare the variable globally
func send(a string, b string){
defer wg.Done()
// do something
}
func main(){
for i:=0; i<50; i++ {
wg.Add(1) // add delta
go send("1111", "2222")
}
wg.Wait() // wait until wg becomes 0
}
任何建议都非常感谢!谢谢!
【问题讨论】:
-
我不确定你在问什么,你的
sendgoroutine 的sync.WaitGroup与main()中的不同,所以没有同步进行。 -
@JimB 嘿,对于含糊的声明感到抱歉!我已经更新了。实际上,我在这里使用同步来在 c++ 线程中执行类似
.join()的操作。从 doc 来看,channel 也可以这样做。使用同步是否合适? -
是的,这就是 WaitGroup 的用途;等待一组 goroutines。我不明白“使用同步的正确方法”的问题,因为这是一个完整的包,你可以在需要时使用它提供的东西。这不是使用
sync.WaitGroup的正确方法,因为main中的wg值与send中的wg值不同。 -
@JimB 感谢指出标题的问题,我已经更新了!对于
wg,我将其声明为全局变量。我猜所有执行send()的新线程都应该有相同的wg,比如main()?另外,如果使用sync.WaitGroup的方法不正确,我应该如何处理该示例?非常感谢! -
您的问题完全是不同的
wg值。这正是它在sync.WaitGroupdocs 中的显示方式。
标签: multithreading go synchronization