管道阻塞的机制 死锁产生的原因 异步 同步 互斥

 结论:如果,编译器(运行),发现一个管道;只有写,而没有读,则该管道,会阻塞。写管道和读管道的频率不一致,无所谓。

package main

import (
	"fmt"
)

func writeData(intChan chan int) {
	for i := 1; i <= 50; i++ {
		intChan <- i
		fmt.Println("writeData", i)
	}
	close(intChan)
}
func readData(intChan chan int, exitChan chan bool) {
	for {
		v, ok := <-intChan
		if !ok {
			break
		}
		fmt.Printf("read 读到的数据为%v\n", v)
	}
	exitChan <- true
	close(exitChan)
}

func main() {
	intChan := make(chan int, 10)
	exitChan := make(chan bool, 1)
	go writeData(intChan)
	for {
		_, ok := <-exitChan
		if !ok {
			break
		}
	}
}

结果会产生死锁,因为只有人存没有人取。

writeData 1
writeData 2
writeData 3
writeData 4
writeData 5
writeData 6
writeData 7
writeData 8
writeData 9
writeData 10
fatal error: all goroutines are asleep - deadlock!

如果读写的速度不一样,不会产生死锁的,因为编译器发现有人可以慢慢读取。

import (
	"fmt"
	"time"
)

//如果读写的速度不一样,不会产生死锁的,因为编译器发现有人可以慢慢读取。
func writeData(intChan chan int) {
	for i := 1; i <= 50; i++ {
		intChan <- i
		fmt.Println("writeData", i)
	}
	close(intChan)
}
func readData(intChan chan int, exitChan chan bool) {
	for {
		v, ok := <-intChan
		if !ok {
			break
		}
		time.Sleep(time.Second)
		fmt.Printf("read 读到的数据为%v\n", v)
	}
	exitChan <- true
	close(exitChan)
}

func main() {
	intChan := make(chan int, 10)
	exitChan := make(chan bool, 1)
	go writeData(intChan)
	go readData(intChan, exitChan)
	for {
		_, ok := <-exitChan
		if !ok {
			break
		}
	}
}

 结果,可以慢慢读不会死锁

writeData 1
writeData 2
writeData 3
writeData 4
writeData 5
writeData 6
writeData 7
writeData 8
writeData 9
writeData 10
writeData 11
read 读到的数据为1
writeData 12
read 读到的数据为2
writeData 13
read 读到的数据为3
writeData 14
read 读到的数据为4
writeData 15
read 读到的数据为5
writeData 16
read 读到的数据为6
writeData 17
read 读到的数据为7
writeData 18
read 读到的数据为8
writeData 19
read 读到的数据为9
writeData 20
read 读到的数据为10
writeData 21
read 读到的数据为11
writeData 22
read 读到的数据为12
writeData 23
read 读到的数据为13
writeData 24
read 读到的数据为14
writeData 25
read 读到的数据为15
writeData 26
read 读到的数据为16
writeData 27
read 读到的数据为17
writeData 28
read 读到的数据为18
writeData 29
read 读到的数据为19
writeData 30
read 读到的数据为20
writeData 31
read 读到的数据为21
writeData 32
read 读到的数据为22
writeData 33
read 读到的数据为23
writeData 34
read 读到的数据为24
writeData 35
read 读到的数据为25
writeData 36
read 读到的数据为26
writeData 37
read 读到的数据为27
writeData 38
read 读到的数据为28
writeData 39
read 读到的数据为29
writeData 40
read 读到的数据为30
writeData 41

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值