golang并发同步问题

golang并发同步问题,go,concurrency,channel,goroutine,Go,Concurrency,Channel,Goroutine,使用goroutines时,我面临一个同步问题。我的程序输出不可预测的结果。我检查了docu,对于无缓冲通道,无法检查是否已处理所有MSG。我将问题简化为这个仍然演示了问题的小演示代码。显然,这不是Golang的问题,而是我的代码的问题。显然,我没有使用正确的并发模式 问题是如何解决这个问题。如果可能的话,我既不想关闭频道,也不想停止蜂巢goroutine。如果我能假设一旦所有的蜜蜂Goroutine都完成了,蜂巢现在也完成了(这就是我使用wg.Wait()尝试的方法),那就太好了 主程序包 进

使用goroutines时,我面临一个同步问题。我的程序输出不可预测的结果。我检查了docu,对于无缓冲通道,无法检查是否已处理所有MSG。我将问题简化为这个仍然演示了问题的小演示代码。显然,这不是Golang的问题,而是我的代码的问题。显然,我没有使用正确的并发模式

问题是如何解决这个问题。如果可能的话,我既不想关闭频道,也不想停止蜂巢goroutine。如果我能假设一旦所有的蜜蜂Goroutine都完成了,蜂巢现在也完成了(这就是我使用wg.Wait()尝试的方法),那就太好了

主程序包
进口(
“fmt”
“同步”
“时间”
)
func main(){
计数:=int64(0)
c:=make(chan int64)
var wg sync.WaitGroup
//蜜蜂

对于i:=0;i您永远不会等待“hive”循环完成,因此有时您会在循环完成之前打印
count

最简单的方法是使用WaitGroup发出关闭通道的信号,并在for range循环上阻塞
main

go func() {
    wg.Wait()
    close(c)
}()

for out := range c {
    count += out
}

您永远不会等待“蜂巢”循环完成,因此有时您会在循环完成之前打印
计数值

最简单的方法是使用WaitGroup发出关闭通道的信号,并在for range循环上阻塞
main

go func() {
    wg.Wait()
    close(c)
}()

for out := range c {
    count += out
}

您的代码中存在数据竞争,请使用“-race”标志(go run/build-race)运行代码。这将在数据竞争发生时打印出有关数据竞争的信息。您无法判断“配置单元”是否循环已处理了
c
中的所有值,但未关闭
c
,也未插入另一个计数器和同步原语。如果所有goroutine都已完成,那么不关闭通道有什么意义?-race标志必须在run之后但在文件名之前。文件名之后的任何内容都将传递给进程,但是-race是一个错误编译器标志。您的代码中存在数据竞争,请使用“-race”标志(go run/build-race)运行代码。这将在数据竞争发生时打印出有关数据竞争的信息。您无法判断“配置单元”是否循环已处理了
c
中的所有值,但未关闭
c
,也未插入另一个计数器和同步原语。如果所有goroutine都已完成,那么不关闭通道有什么意义?-race标志必须在run之后但在文件名之前。文件名之后的任何内容都将传递给进程,但是-race是一个错误编译器标志。