【声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

循环队列是很多人喜欢用的一种数据结构。本着先来先服务的特性,循环队列是一种十分简单、健壮的数据结构。不像链表、二叉树,如果使用不慎,就会造成很大的麻烦,但是在循环队列上面则没有这个烦恼。

同样而言,循环队列具有很强的并行性,如果服务的数据比较少,那么完全可以利用两个线程进行数据的保存和处理工作。只要注意在编写队列的时候不要引入公共参数,那么几乎不会有任何的并行烦恼。这其中的原因就在于,循环队列没有公共变量,所以不存在对公共变量的修改问题。队列是否为空或者是否为满,完全可以由队列的start和end这两个参数决定,而这两个参数的修改是分开来的,不可能在一个线程上面解决,这就是队列并行的本质原因。

同学们可以自己编写一个简单的双线程代码,验证自己的想法,同时可以不断加深自己对多线程代码的分析和理解能力。下面就是一段在linux上编写的队列处理代码,欢迎大家多提宝贵意见。编译的方法十分简单,即gcc queue.c -g -o queue -lpthread,这里加上-g主要是为了调试使用。

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <pthread.h>struct QUEUE
{int* buffer;int count;int start;int end;
};#define STATUS int
#define TRUE   1
#define FALSE  0struct QUEUE* alloc_queue(int count)
{struct QUEUE* p_queue;if(0 == count){goto error1;}p_queue = (struct QUEUE*)malloc(sizeof(struct QUEUE));if(NULL == p_queue){goto error1;}memset(p_queue, 0, sizeof(struct QUEUE));p_queue->count = count;p_queue->buffer = (int*)malloc(sizeof(int)* count);if(NULL == p_queue->buffer){goto error2;}memset(p_queue->buffer, 0, sizeof(int) * count);return p_queue;error2:free(p_queue);error1:return NULL;
}STATUS add_data_into_queue(struct QUEUE* p_queue, int data)
{if(NULL == p_queue){return FALSE;}if(p_queue->end == (p_queue->start + 1) % p_queue->count){return FALSE;}p_queue->buffer[p_queue->start] = data;p_queue->start = (p_queue->start +  1) % p_queue->count;return TRUE;
}STATUS get_data_from_queue(struct QUEUE* p_queue, int* p_data)
{if(NULL == p_queue || NULL == p_data){return FALSE;}if(p_queue->start == p_queue->end){return FALSE;}p_data[0] = p_queue->buffer[p_queue->end];p_queue->end = (p_queue->end + 1) % p_queue->count;return TRUE;
}static void* set_func(void* args)
{int index = 1;if(NULL == args){goto end;}while(1){while(FALSE == add_data_into_queue((struct QUEUE*)args, index));printf("set data %d\n", index ++);sleep(1);}end:return NULL;
}static void* get_func(void* args)
{int data;if(NULL == args){goto end;}while(1){while(FALSE == get_data_from_queue((struct QUEUE*)args, &data));printf("find data %d\n", data);sleep(3);}end:return NULL;
}int main(int argc, char* argv[])
{pthread_t pid1, pid2;struct QUEUE* p_queue;p_queue = alloc_queue(10);if(NULL == p_queue){goto end;}if(pthread_create(&pid1, NULL, set_func, p_queue)){goto end;}if(pthread_create(&pid2, NULL, get_func, p_queue)){goto end;}while(1){sleep(0);}end:return 1;
}

随想录(为什么循环队列具有先天的并行性)相关推荐

  1. 【C++】多线程(链式、循环队列)实现生产者消费者模式

    生产者消费者模式:         生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...

  2. 数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)

    目录 一.顺序队列 1.存储结构 2.入队和出队 总代码 二.循环队列 总代码: 三.链队列 1.存储结构 2.入队和出队 总代码 一.顺序队列 队列特征:先进后出.后进后出. 1.存储结构 //队列 ...

  3. 原生js循环展示dom_【前端面试】用一道题讲 js 的事件循环队列

    昨天去面了滴滴,一口气面了三面,考了 promise 和事件循环.之前的猿辅导也考察了这些,几乎所有的大厂中厂都一定会考原生 js 的事件循环队列. 今天,我把昨天考察的原题拿出来分析一下. setT ...

  4. 【数据结构】顺序循环队列及其实现(C语言)

    给定一个大小为MAXSIZE的数组储存一个队列,经过若干次的插入和删除以后,当队尾指针 rear = MAXSIZE 时,呈现队列满的状态,而事实上数组的前部可能还有空闲的位置.为了有效地利用空间,引 ...

  5. 【Java】 LeetCode 622. 设计循环队列 (有关实现循环队列的讲解)

    题目: 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列的一 ...

  6. 第3关:单链表循环队列

    #ifndef queue__h #define queue__h#include <iostream>struct Node // 数据节点 {int data; // 数据类型Node ...

  7. 循环队列,定义循环队列长度为10,编写初始化队列、入队、出队、求队长,实现10,20,30,40,50,60,70,80入队,10,20,30出队,56,67入队的算法功能。

    循环队列,定义循环队列长度为10,编写初始化队列.入队.出队.求队长,实现10,20,30,40,50,60,70,80入队,10,20,30出队,56,67入队的算法功能. #include< ...

  8. 【swjtu】数据结构实验3_基于循环队列的排队买票模拟程序

    实验内容及要求: 编程建立循环队列存储结构,对排队买票过程进行模拟.要求程序在控制台屏幕上显示字符菜单: 1. 排队--输入新到达的买票人姓名,加入买票队列中: 2. 售票--排队队列中最前面的人购票 ...

  9. python循环队列_关于循环队列的一些讲解

    前面讲到了队列的"假溢出",解决假溢出的办法就是后面满了,就再从头开始,也就是头尾相接的循环.我们把队列的这种头尾相接的顺序存储结构称为循环队列. 比如昨天的例子,rear可以改为 ...

最新文章

  1. 多目标跟踪(MOT)入门
  2. Xamarin.Forms的滚动视图ScrollView
  3. c# websocketServer
  4. python编程能力等级测试_56岁的潘石屹参加全国青少年编程能力等级测试,你还在问编程是什么?...
  5. JS中使用定时动态获取系统当前时间
  6. Visual Studio 15.5预览版先睹为快
  7. PHP在Tomcat中CSS出错,tomcat找不到css怎么办
  8. 威海二职工业机器人专业_工业机器人专业就业前景-山东省好的中专学校
  9. mupdf java_mupdf库学习
  10. Design7:数据删除设计
  11. C++ 接口继承与实现继承的区别和选择
  12. 【面试】排序算法整理
  13. 【二维码识别】基于matlab GUI 灰度+二值化+校正QR二维码识别与生成【含Matlab源码 600期】
  14. 【考试总结贴】工程测量学
  15. 零散专题31 JS中的日期对象
  16. AltiumDesigner快捷键——SCH和SCHLIB编辑快捷键
  17. 数据结构 ADT例子
  18. 012.二叉树的所有路径
  19. python爬取上证股票的历史记录并画历史收盘图曲线
  20. 第一个Springboot程序

热门文章

  1. 30个你必须记住的CSS选择符
  2. IDEA 运行maven命令时报错: -Dmaven.multiModuleProjectDirectory system propery is not set
  3. Nodejs开发框架Express3.0开发手记
  4. DNS资源记录类型的总结
  5. linux基础命令(总结)
  6. node.js中获取请求当前页的前一页URL地址
  7. InnoDB之Dirty Page、Redo log
  8. vi-vim :删除、撤销、恢复删除、复制删除
  9. JS语法apply()与call()的区别
  10. 华为笔试题 简答错误记录(字符串处理,好题!!!)