golang channel

1.底层实现
2.有无缓存区别
3.线程安全
4.使用注意
5.CSP并发模型
6.使用场景

1.底层实现
channel底层是通过循环数组实现的先入先出队列,使用互斥锁保证channel写入和读取数据的线程安全

2.有无缓存区别
(1)创建方式不同, 有缓冲的chan会带上缓冲区大小,make(chan type, size)
(2)阻塞:
无缓冲的读写都会阻塞,有其他协程准备读了, channel才能写入
有缓冲的chan当缓冲满了 写入阻塞

3.线程安全
底层使用互斥锁,保证读写channel队列的线程安全

4.使用注意
(1)已经close的chan
写:panic
读:如果缓冲区还有数据可以读;如果缓冲没有数据,返回空值
close: panic (一个channel不能多次关闭)
(2)未初始化的chan
读写 死锁
关闭 panic
(3)信号通知
如果多个goroutinue都监听同一个channel,那么channel的数据被随机一个gorountine读取消费
如果多个goroutinue都监听同一个channel,这个channel被关闭,所有gorountine都能收到退出信号

5.CSP并发模型
golang基于goroutinue和channel实现csp并发模型,将生产者和消费者解耦
不要通过共享内存来通信,而是使用通信来共享内存

6.使用场景
不同协程之前通信
停止信号监听
定时任务
生产者消费者解耦
控制并发数

runtime/chan.go


type hchan 
struct {
   
   

	// 循环数组中元素的数量
	qcount uint // total data in the queue
	// 循环数组长度
	dataqsiz uint // size of the circular queue

	// 循环数组
	buf      unsafe.Pointer // points to an array of dataqsiz elements
	elemsize uint16

	// chan是否关闭
	closed   uint32
	elemtype *_type // element type

	// 下一次写下标位置
	sendx uint // send index
	// 下一次读下标位置
	recvx uint // receive index

	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值