【专栏】数据结构和算法之美-队列:队列在线程池等有限资源池中的应用

本文主要是介绍【专栏】数据结构和算法之美-队列:队列在线程池等有限资源池中的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习笔记

如何理解“队列”?

结构特征
  • 操作受限的线性表数据结构
  • 两端开放,一端是数据的入口,另一端是数据的出口
行为特征
  • 先进先出,类似于水管,从一端进水,另一端出水,先进去的水会先流出来

如何实现队列?

基于数组实现:顺序队列
/*Queue implement based on the array*/
/*Queue implement based on the linked list*/
/*Circl Queue implement based on the array*/#include <stdio.h>#define QUEUE_LEN 8
#define TRUE (unsigned short)1
#define FALSE (unsigned short)0typedef unsigned short bool;static int queueArray[QUEUE_LEN];bool inQueue(int data, int *phead, int *ptail)
{bool ret = FALSE;int currentIndex = *ptail;int n = 0;if(*ptail == QUEUE_LEN){/*it is full*/for(; n < ((*ptail) - (*phead)); n++){queueArray[n] = queueArray[(*phead) + n];}*phead = 0;if(n < QUEUE_LEN){queueArray[n] = data;*ptail = n + 1;ret = TRUE;}else{printf("error! queue is full\n");ret = FALSE;}}else{queueArray[currentIndex] = data;*ptail = currentIndex+1;ret = TRUE;}return (ret);}int outQueue(int *phead, int *ptail)
{int ret = 0;int currentIndex = *phead;if(*ptail == *phead){return -1;}else{ret = queueArray[currentIndex];*phead = currentIndex + 1;}return ret;
}void main(void)
{int tail = 0;int head = 0;int data = 1;int n = 0;for (; n < QUEUE_LEN; n++){inQueue(data, &head, &tail);data += 1;}printf("###########test 1: new data cann't enter while the queue is full: %d\n", inQueue(9,&head, &tail));printf("###########test 2: data leave from the queue: %d\n", outQueue(&head, &tail));printf("************head=%d, tail=%d, the latest leaving value is %d\n", head, tail, queueArray[head -1]);printf("***********test 3: new data can enter even though tail reaches the end of the queue\n");inQueue(10, &head, &tail);printf("************tail's position:%d, the latest entering value is %d\n", tail, queueArray[tail - 1]);
}

循环队列

结构特征
  • 首尾相连,成环形
  • 对于用数组实现的非循环队列,队满条件tail == n,队空条件head == tail。 而循环队列,队满特征是(tail+1)%n=head;
    -在这里插入图片描述
行为特征
  • 新元素添加进来后,如果达到队满条件,tail在环中后移一位,而不是直接加1
特殊特性的队列

阻塞队列特征

  • 队空时,从对头取数据会被阻塞
  • 队满时,插入数据操作会被阻塞
  • Linux环形缓存
  • 在这里插入图片描述
    阻塞队列是“生产者-消费者模型”的一种实现策略。
    而在多线程情况下,多个线程同时操作队列,如下,有多个线程同时从队头取数据,保证线程安全的队列我们就叫作并发队列,那么如何实现它呢?(看实战篇的Disruptor)
    在这里插入图片描述
    关于线程池会用到队列排队请求?

这篇关于【专栏】数据结构和算法之美-队列:队列在线程池等有限资源池中的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/668701

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig