登录
首页 >  Golang >  Go问答

Golang中的通道通信死锁问题

来源:stackoverflow

时间:2024-03-21 21:09:40 306浏览 收藏

在 Go 语言中,通过通道进行通信时,如果通道未正确初始化,可能会导致死锁问题。在给定的代码中,包 functionspackage.ChannelOutFunct 未初始化,因此它是一个 nil 通道。写入 nil 通道或从 nil 通道读取将始终阻塞,从而导致死锁。

问题内容

两个包 - golang 之间的通道通信出现死锁。

我有两个包,通过两个通道进行通信。一个是主要的,另一个是函数。当我运行它时,我遇到了死锁。

package main

import (
    functionspackage "goejemplos/subfolder"
    "fmt"
    "sync"
)

func main() {
    var wg sync.waitgroup

    channelsenddata := make(chan functionspackage.functionstruct, 1)
    defer close(channelsenddata)

    data := functionspackage.functionstruct{
        fieldone: 3.56,
        fieldtwo: 23,
    }

    channelsenddata <- data

    wg.add(1)
    go functionspackage.functionext(channelsenddata, &wg)

    recibe := <-functionspackage.channeloutfunct

    fmt.println("channelout: ", recibe)

    close(functionspackage.channeloutfunct)

    wg.wait()
}

另一个包是

package functionspackage

import "sync"

type functionstruct struct {
    fieldone float64
    fieldtwo int
}

var channeloutfunct chan float64

func functionext(recibechan chan functionstruct, wg *sync.waitgroup) (channeloutfunct chan float64) {

    recivedata := <-recibechan

    result := recivedata.fieldone * float64(recivedata.fieldtwo)

    channeloutfunct <- result

    wg.done()

    return channeloutfunct
}

这就是僵局。

PS C:\Go-Project\src\GoEjemplos> go run main.go
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive (nil chan)]:
main.main()
        C:/Go-Project/src/GoEjemplos/main.go:32 +0x13d

goroutine 19 [chan send (nil chan)]:
GoEjemplos/subFolder.FunctionExt(0xc0000d4000, 0xc0000a2070, 0xc0000c9f18)
        C:/Go-Project/src/GoEjemplos/subFolder/functionsPackage.go:19 +0x85
created by main.main
        C:/Go-Project/src/GoEjemplos/main.go:30 +0x11a
exit status 2
PS C:\Go-Project\src\GoEjemplos>

你能帮我解释一下问题出在哪里吗?

谢谢!


解决方案


通道 functionspackage.ChannelOutFunct 未初始化,因此它是一个 nil 通道。写入 nil 通道或从 nil 通道读取将始终阻塞。

https://dave.cheney.net/2014/03/19/channel-axioms

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Golang中的通道通信死锁问题》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>