预防死锁? Golang | 协程配合管道来帮你实现

简述流程:

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
如果文章对你帮助,记得留下一个赞哦~~

猜你喜欢

转载自blog.csdn.net/weixin_44355591/article/details/107114619