生产者消费者唤醒处理
三态解决生产者 唤醒 消费者的系统调用消耗
消费者:
生产者:
准备数据
放入队列
Test:cas(空闲态→工作态) 并判断原状态
- 工作态:OK,消费者本来就在工作态,所以数据必将被处理
- 检查态:消费者可能已经在Check之前或之后,此时应当堵塞直到脱离检查态以后再跳转到 Test重试。
a) (进一步优化使多个生产者只有一个堵塞)。
b) (进一步优化加多检查态1、2、3……使得生产者堵塞概率低。) - 空闲态:OK,新的状态是工作态(且是由本生产者转变的),因此现在调用API唤醒生产者。
- 退出态:消费者不干了,这里爱咋办咋办。
另一套唤醒处理方案也挺好
生产者: a增加任务数,b读取空闲消费者数 c判断是否全忙 d全忙?不唤醒
消费者: 1增加空闲消费者数 2读任务数 3判断任务数 4无任务?休眠 5减少消费者数 6处理数据
https://github.com/Cyinx/einx/blob/master/queue/cond_queue.go