Golang 发生死锁 协程配合管道解决

    技术2024-07-25  15

    文章导航目录

    简述流程:流程图流程注释:代码实现:

    简述流程:

    1、开启一个writeData 协程,向管道中写入50个整数 2、开启一个readData 协程,从管道intChan中读取writeData写入的数据 3、注意:write 和read 操作的是同一个管道 4、主线程需要等待writeData 和 readData协程都完成工作才能退出管道


    流程图

    流程注释:

    intChan 负责内容的写和读for 循环是为了防止协程还未读取完导致当前主线程关闭

    代码实现:

    package main import ( "fmt" ) // 向intChan中写入50个数据 func writeData(intChan chan int){ for i := 1; i < 50; i ++ { intChan<-i fmt.Println("writeData 写入数据", i) } close(intChan) // 这里如果不close readData就会发生死锁 } // 再从intChan中读取50个数据,读取完后并向exitChan中写入一个True func readData(intChan chan int, exitChan chan bool){ for { v, ok := <-intChan if !ok { break // 50个数据读完后才break } fmt.Printf("readData 读到数据=%v \n", v) } exitChan <- true close(exitChan) } func main() { // 创建两个管道 intChan := make(chan int, 50) exitChan := make(chan bool, 1) go writeData(intChan) go readData(intChan, exitChan) // 这里的for是为了防止读协程还未读取完从而导致主线程关闭 // 因为读协程在读完50个数据后会往exitChan管道写入一个True,随后通过下面的for循环检测有没有True,从而确定要不要退出主线程 for { _, ok := <-exitChan if !ok { break } } }

    我会两种语言,一种写给程序执行,一种说给你听. 来自LiuYoung的个人博客 Copyright © 冀ICP备20002380号

    Smile 如果文章对你帮助,记得留下一个赞哦~~
    Processed: 0.035, SQL: 9