随想录(为什么循环队列具有先天的并行性)
【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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;
}
随想录(为什么循环队列具有先天的并行性)相关推荐
- 【C++】多线程(链式、循环队列)实现生产者消费者模式
生产者消费者模式: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...
- 数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)
目录 一.顺序队列 1.存储结构 2.入队和出队 总代码 二.循环队列 总代码: 三.链队列 1.存储结构 2.入队和出队 总代码 一.顺序队列 队列特征:先进后出.后进后出. 1.存储结构 //队列 ...
- 原生js循环展示dom_【前端面试】用一道题讲 js 的事件循环队列
昨天去面了滴滴,一口气面了三面,考了 promise 和事件循环.之前的猿辅导也考察了这些,几乎所有的大厂中厂都一定会考原生 js 的事件循环队列. 今天,我把昨天考察的原题拿出来分析一下. setT ...
- 【数据结构】顺序循环队列及其实现(C语言)
给定一个大小为MAXSIZE的数组储存一个队列,经过若干次的插入和删除以后,当队尾指针 rear = MAXSIZE 时,呈现队列满的状态,而事实上数组的前部可能还有空闲的位置.为了有效地利用空间,引 ...
- 【Java】 LeetCode 622. 设计循环队列 (有关实现循环队列的讲解)
题目: 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列的一 ...
- 第3关:单链表循环队列
#ifndef queue__h #define queue__h#include <iostream>struct Node // 数据节点 {int data; // 数据类型Node ...
- 循环队列,定义循环队列长度为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< ...
- 【swjtu】数据结构实验3_基于循环队列的排队买票模拟程序
实验内容及要求: 编程建立循环队列存储结构,对排队买票过程进行模拟.要求程序在控制台屏幕上显示字符菜单: 1. 排队--输入新到达的买票人姓名,加入买票队列中: 2. 售票--排队队列中最前面的人购票 ...
- python循环队列_关于循环队列的一些讲解
前面讲到了队列的"假溢出",解决假溢出的办法就是后面满了,就再从头开始,也就是头尾相接的循环.我们把队列的这种头尾相接的顺序存储结构称为循环队列. 比如昨天的例子,rear可以改为 ...
最新文章
- 多目标跟踪(MOT)入门
- Xamarin.Forms的滚动视图ScrollView
- c# websocketServer
- python编程能力等级测试_56岁的潘石屹参加全国青少年编程能力等级测试,你还在问编程是什么?...
- JS中使用定时动态获取系统当前时间
- Visual Studio 15.5预览版先睹为快
- PHP在Tomcat中CSS出错,tomcat找不到css怎么办
- 威海二职工业机器人专业_工业机器人专业就业前景-山东省好的中专学校
- mupdf java_mupdf库学习
- Design7:数据删除设计
- C++ 接口继承与实现继承的区别和选择
- 【面试】排序算法整理
- 【二维码识别】基于matlab GUI 灰度+二值化+校正QR二维码识别与生成【含Matlab源码 600期】
- 【考试总结贴】工程测量学
- 零散专题31 JS中的日期对象
- AltiumDesigner快捷键——SCH和SCHLIB编辑快捷键
- 数据结构 ADT例子
- 012.二叉树的所有路径
- python爬取上证股票的历史记录并画历史收盘图曲线
- 第一个Springboot程序
热门文章
- 30个你必须记住的CSS选择符
- IDEA 运行maven命令时报错: -Dmaven.multiModuleProjectDirectory system propery is not set
- Nodejs开发框架Express3.0开发手记
- DNS资源记录类型的总结
- linux基础命令(总结)
- node.js中获取请求当前页的前一页URL地址
- InnoDB之Dirty Page、Redo log
- vi-vim :删除、撤销、恢复删除、复制删除
- JS语法apply()与call()的区别
- 华为笔试题 简答错误记录(字符串处理,好题!!!)