为了账号安全,请及时绑定邮箱和手机立即绑定

Golang并发死锁

Golang并发死锁

Go
富国沪深 2022-01-17 18:24:41
谁能帮我确定为什么在我正在编写的 Go 代码末尾出现死锁错误?该程序实际上运行正常,但出现死锁错误。我是编写并发代码的新手,因此非常感谢任何帮助。我省略了一些我知道不是问题的行,只是为了让它更快阅读。func MoveWorksheets(worksheetList []string) {var wg sync.WaitGroupfor _, worksheet := range worksheetList {    wg.Add(1)    go MoveFile(src, dst, wg)    }    wg.Wait()}func MoveFile(src, dst string, wg sync.WaitGroup) (err error) {    defer wg.Done()    sfi, err := os.Stat(src)    if err != nil {        return    }    if !sfi.Mode().IsRegular() {        // cannot copy non-regular files (e.g., directories,        // symlinks, devices, etc.)        return fmt.Errorf("CopyFile: non-regular source file %s (%q)", sfi.Name(), sfi.Mode().String())    }    dfi, err := os.Stat(dst)    if err != nil {        if !os.IsNotExist(err) {            return        }    } else {        if !(dfi.Mode().IsRegular()) {            return fmt.Errorf("CopyFile: non-regular destination file %s (%q)", dfi.Name(), dfi.Mode().String())        }        if os.SameFile(sfi, dfi) {            return        }    }    /*if err = os.Link(src, dst); err == nil {        return    }*/    err = MoveFileContents(src, dst)    return}func MoveFileContents(src, dst string) (err error) {    merr := os.Rename(src, dst)    if merr != nil {        log.Fatal(merr)    }    return}
查看完整描述

2 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

MoveFile正在获取 的副本wg,因此您在不同的 s上调用Wait()和。尝试将其作为指针传递。Done()WaitGroup


查看完整回答
反对 回复 2022-01-17
?
HUX布斯

TA贡献1876条经验 获得超6个赞

尝试传递wg变量的引用,在您的代码MoveFile函数中获取它自己的 WaitGroup 副本。这就是它造成死锁的原因。


   func MoveWorksheets(worksheetList []string) {


        var wg sync.WaitGroup


        for _, worksheet := range worksheetList {


          wg.Add(1)


          go MoveFile(src, dst, &wg)


        }


        wg.Wait()

    }


    func MoveFile(src, dst string, wg *sync.WaitGroup) (err error) {


        defer wg.Done()


        sfi, err := os.Stat(src)

        if err != nil {

            return

        }

        if !sfi.Mode().IsRegular() {

            // cannot copy non-regular files (e.g., directories,

            // symlinks, devices, etc.)

            return fmt.Errorf("CopyFile: non-regular source file %s (%q)", sfi.Name(), sfi.Mode().String())

        }

        dfi, err := os.Stat(dst)

        if err != nil {

            if !os.IsNotExist(err) {

                return

            }

        } else {

            if !(dfi.Mode().IsRegular()) {

                return fmt.Errorf("CopyFile: non-regular destination file %s (%q)", dfi.Name(), dfi.Mode().String())

            }

            if os.SameFile(sfi, dfi) {

                return

            }

        }

        /*if err = os.Link(src, dst); err == nil {

            return

        }*/

        err = MoveFileContents(src, dst)

        return

    }


    func MoveFileContents(src, dst string) (err error) {


        merr := os.Rename(src, dst)


        if merr != nil {

            log.Fatal(merr)

        }


        return

    }


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信