数据结构与算法学习--队列

今天我们开始学习队列的;队列在实际项目开发中使用的很广泛,比如我们经常说的线程池,在处理大部分资源不足的情况下,都会考虑使用队列来缓存请求数据。
在这里插入图片描述
1、阻塞队列
阻塞队列时一种典型的“生产者–消费者”模型,就在队列的基础上增加的阻塞的功能(其实就是一种同步机制)。当队列为空时,出队阻塞;当队列满时,入队阻塞。
还有下面多消费者–单生产者模式。
在这里插入图片描述
上面的就是我们线程池的基本架构,在多个线程同时操作队列时,就存在线程安全的问题。目前有两种实现:1、通过线程锁及条件变量,2;利用cas无锁操作实现并发,降低系统处理性能。内存池原理及实现可以参照文章
问题:线程池没有空闲线程时,有新的任务请求线程资源时,线程池如何处理?各种处理策略如何实现?
我们一般有2中处理策略,1、非阻塞的处理方式,直接拒绝任务请求;2、阻塞的处理方式,加入请求队列,等有空闲线程时,取出队列请求继续处理。如果实现排队请求?
1)基于链表的实现方式,可以实现一个支持无线排队的无界队列,但是可能会导致过多的请求排队,导致请求处理响应时间很长。针对响应时间敏感的系统,基于链表实现无限排队的线程池是不合理的。
2)基于数组实现有界的队列,队列的大小有限,所以线程池中排队的请求超过队列大小时,接下的请求会被拒绝。这种方式对响应时间敏感的系统更加合适。不过设置一个合理的队列带下,也是非常有讲究的。队列太大导致等待的请求太多;队列太小导致无法充分利用系统资源、发挥最大性能。
思考:
关于并发队列,如何实现无锁并发队列?
考虑使用CAS原子操作实现无锁队列。
队列的代码可以参考github上的代码:https://github.com/jin13417/algo/tree/master/c-cpp/09_queue

猜你喜欢

转载自blog.csdn.net/jsh13417/article/details/83066584