duanbing8817 2018-03-12 02:51
浏览 13
已采纳

混淆延迟wg。完成和频道

I encounter a problem about using defer wg.Done and channel.

If I coded like below, there is no problem.

for i := 0; i < ntasks; i++ {
    wg.Add(1)
    go func(args DoTaskArgs) {
        // defer wg.Done()
        for {
            worker := <-registerChan
            ok := call(worker, "Worker.DoTask", &args, nil)
            if ok {
                wg.Done()
                // go func() {
                registerChan <- worker
                // }()
                break
            }
        }
    }(DoTaskArgs{jobName, mapFiles[i], phase, i, n_other})
}
wg.Wait()

But if I use defer wg.Done(), the code would be stucked, unless wrap the registerChan <- worker with go func.

for i := 0; i < ntasks; i++ {
    wg.Add(1)
    go func(args DoTaskArgs) {
        defer wg.Done()
        for {
            worker := <-registerChan
            ok := call(worker, "Worker.DoTask", &args, nil)
            if ok {
                // go func() {
                registerChan <- worker
                // }()
                break
            }
        }
    }(DoTaskArgs{jobName, mapFiles[i], phase, i, n_other})
}
wg.Wait()

What is the problem here?

  • 写回答

1条回答 默认 最新

  • donglu3087 2018-03-12 03:30
    关注

    Well, first off, your channel use is confused and will block. In the goroutine it reads from the channel. But nothing wrote into it.

    I don't think your problem has anything to do with defer.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教