消息队列
step1:顺序队列
消息队列用来解决类似生产者-消费者模型问题,按照实现方式,分为基于链表实现的链式队列和基于数组实现的顺序队列
对于链式队列,优点是支持无限大,缺点是性能低;
对于顺序队列,优点是性能高,缺点是数量有限(当队列满时生产者就需要等待)
而消息队列为了追求性能和可控性(链式队列理论无限大因此对于内存不可控),绝大多数都采用顺序队列
step2:循环顺序队列
相比普通顺序队列,循环顺序队列在添加、删除操作时无需进行数据搬移,因此我们进一步对顺序队列优化为循环顺序队列
step3:加锁的循环顺序队列
循环顺序队列虽然性能高,但是高并发下会造成写入覆盖、重复读取等问题,例如添加时:
1. void add(int val) {
2. if ((tail + 1) % size == head) return;
3. data[tail] = val;
4. tail = (tail + 1) % size;
6. }
比如线程1执行到第三行后,线程2开始执行add()&#