并发小结:
区分并行和并发,概念里头并发包括并行
多进程编程:
进程间通信包括,基于通信 基于信号 和 基于同步的ipc方法
--基于通信ipc方法,包括基于数据传递和内存共享。
---数据传递主要通过管道pipe和消息队列queue来实现
基于同步的ipc方法中,是通过信号量来同步的
基于信号的是通过操作系统的信号机制,唯一的一种异步ipc方法
go语言,包括 管道 信号和socket(代码演示)
并发和循环:goroutine 放到for循环中,如果元素不是引用类型,会出现只循环最后一个值的情况,原因是gorotuine执行之前for循环已经执行完毕,通过把元素单个值赋给另一个元素,来实现并发机制。这里的原来是通过值拷贝来实现
管道:
分为匿名管道和命名管道,系统提供的管道是阻塞的,go提供了可用多路复用的内存管道 io.pipe
管道队列属于缓冲队列,接收方会复制发送的值,如果出现互相等待,如多个接收方等待,发送方会直接赋值给接收方,又或是已满通道的接收方,会把最早缓冲的元素复制给接收方,再把最早等待的发送方的值直接复制到这个位置上。
管道的收发与数据类型相关,引用的数据类型,修改接收方也会改变发送方数据,多用引用类型元素
管道关闭操作,只在发送方,只能关闭一次,否则会引发panic
双向管道可以转换成单向管道用,单向管道不可转成双向管道
管道多路复用select,如果多条case满足,采用伪随机任意选择一个,如果都不满足,且没有default,goroutine会被阻塞
非缓冲管道同步时会等待最慢的一方,且发送方和接收方每收发一个元素就需要握手,通过cap判断是否为缓冲管道
定时器,可以复用,不必循环创建,如果到期前停止了它,那么管道无法缓冲数据,且无法接收到传值,如果接收,会造成goroutine阻塞。如果未能及时接收数据,那么该数据会一直阻塞,会面数据会被丢掉。并且,传递的相对到期时间必须是一个整数,否则定时器失效。
断续器,类似crontab,用于定时触发
加锁:互斥锁+读写锁
互斥锁能对共享资源的访问唯一性进行控制,防止竞态
读写锁,写与写互斥,读与写互斥,读与读共享
sync.once 只执行一次,哪怕是放到循环中去
临时对象池,就像缓存池,具备伸缩性和垃圾回收机制,获取数据是随机的,对该池中的取值不要抱有确切的期待
进程状态切换(如图)
进程同步:原子操作+临界区(如图)
多线程编程:
线程状态(如图)
线程调度(如图)
线程模型(如图)
线程同步(如图):互斥+条件=>线程安全性
go并发机制:
线程实现模型(如图)
调度器(如图)
goroutine和channel(代码)
go同步:锁 条件变量 原子操作 单次执行 waitGroup 对象池 (代码)
其他内容:
https://blog.youkuaiyun.com/li_101357/article/details/80281530
https://www.cnblogs.com/aaronthon/p/10946433.html
https://segmentfault.com/a/1190000019582694
https://blog.youkuaiyun.com/xxywxlyygx/article/details/87383266