初级会员
  • 第 59030 位会员
  • runningstarh
  • 一只流浪的猪
  • 2020-12-30 10:12:17
  • Offline
  • 23 39

最近发布的主题

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • #2 @li621020 非常感谢啦,认真阅读你的代码后发现,for加waitgroup的使用也是非常棒的,代码非常简洁,学习学习了!同时通过对比时间我发现我原来的代码存在问题,协程与主线程之间没有信息交流,导致多次运行后发现可能不会在一百次停下来,需要再加一个channal实现协程与主线程的通信。在这儿非常感谢你的回复,让我更加理解协程的意义了。这里贴出更加复杂的代码,希望后面的阅读者注意我犯过的错误,谢谢啦 `type Info struct { semiA chan int semiB chan int semiC chan int ch chan int } var result int =0 func (in *Info)printA(){ for{ in.semiA<-0 fmt.Println("A") in.semiB<-0 } } func (in *Info)printB(){ for{ <-in.semiB fmt.Println("B") in.semiC<-0 } } func (in *Info)printC(){ for { <-in.semiA <-in.semiC fmt.Println("C") //fmt.Println("******************") result++ fmt.Println(result) if result==100{ fmt.Println("fish ") in.ch<-1 close(in.ch) break } } } func main(){ starttime:=time.Now() start:=new(Info) start.semiA=make(chan int) start.semiB=make(chan int) start.semiC=make(chan int) start.ch=make(chan int) //ch :=make(chan int) go start.printA() go start.printB() go start.printC() <-start.ch //time.Sleep(1*time.Second) defer close(start.semiA) defer close(start.semiB) defer close(start.semiC) //<-ch endtime:=time.Since(starttime) fmt.Println(endtime) }`,同时我希望大家多多思考,更合适的代码,不断地优化自己的代码,感谢您的评论
  • printC的时候,有两个参数进行交换,没有对其顺序操作进行加锁,导致多goroutine进行对行抢占,你对流程加锁后就可以避免错误,具体的调试你需要自己进行