队列、函数-多线程 线程队列的实现-by小雨
发一下牢骚和主题无关:
考参他人的方法,自己做了简略修改,现实一个通用的线程队列。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>#define POOL_SIZE 10
#define QUEUE_LEN 20
pthread_mutex_t queue_lock; //队列锁
pthread_cond_t queue_cond; //条件量变int head = 0, tail = 0;
int queue[QUEUE_LEN];void delay(int x)
{int i,j;for(i = 0; i < x; i++)for(j = 0; j <x; j++);
}void fun1(){printf("fun1 start\n");delay(1000);printf("fun1 end\n");
}void fun2(){printf("fun2 start\n");delay(2000);printf("fun2 end\n");
}void fun3(){printf("fun3 start\n");delay(3000);printf("fun3 end\n");
}void fun4(){printf("fun4 start\n");delay(4000);printf("fun4 end\n");
}int dequeue()//出对列函数
{int y;pthread_mutex_lock(&queue_lock);while(head == tail)//队列中 无情求时,待等{pthread_cond_wait(&queue_cond, &queue_lock);//动自释放锁 }y = queue[++head];//需做循环处置 queue[head] is NULLif(head >= QUEUE_LEN)head = 0;pthread_mutex_unlock(&queue_lock);return y;
}void * process_queue(void *arg)
{int x = 0;for(;;){x = dequeue();printf("%d dequeue \n",x);switch(x){case 1:fun1(); break;case 2:fun2(); break;case 3:fun3(); break;default:fun4(); break;} }
}int enqueue(int x)//插入求请
{int next;pthread_mutex_lock(&queue_lock);next = tail + 1;if(next >= QUEUE_LEN)next = 0;if(next == head){pthread_cond_signal(&queue_cond);//pthread_mutex_unlock(&queue_lock); return 0;// 示表队列已满}queue[next] = x;tail = next; pthread_cond_signal(&queue_cond);//激活pthread_mutex_unlock(&queue_lock);return 1;//入队胜利
}int main()
{int i;int num = 0;pthread_t tid[POOL_SIZE];pthread_mutex_init(&queue_lock, NULL);pthread_cond_init(&queue_cond, NULL);for(i = 0; i < POOL_SIZE; i++)pthread_create(&tid[i], NULL, process_queue, NULL);while(1){scanf("%d",&num);if(0 == num)// break;return 0;printf("%d ",num);while(!enqueue(num))//队列满时 待等{printf("queue is full\n");sleep(1);}}// for(i = 0; i < POOL_SIZE; i++)
// pthread_join(tid[i], NULL);// pthread_mutex_destory(&queue_lock);
// pthread_cond_destroy(&queue_cond);return 0;
}
还有一些不足之处,随后补上。
测试方法:
键入 :
4 3 2 1
结果:
4 3 2 1 4 dequeue
fun4 start
3 dequeue
fun3 start
2 dequeue
fun2 start
1 dequeue
fun1 start
fun1 end
fun2 end
fun3 end
fun4 end
键入:
0
退出函数
文章结束给大家分享下程序员的一些笑话语录: 古鸽是一种搜索隐禽,在中国快绝迹了…初步的研究表明,古鸽的离去,很可能导致另一种长着熊爪,酷似古鸽,却又习性不同的猛禽类——犤毒鸟
队列、函数-多线程 线程队列的实现-by小雨相关推荐
- java多线程消息队列_java多线程消息队列的实现
1.定义一个队列缓存池: private static List queueCache = new LinkedList(); 2.定义队列缓冲池最大消息数,如果达到该值,那么队列检入将等待检出低于该 ...
- Python 线程队列 Queue – FIFO - Python零基础入门教程
目录 一.Python 线程队列分类 二.Python 线程先进先出队列 Queue 简介 三.Python 线程先进先出队列 Queue 常用函数 四.Python 线程先进先出队列 Queue 使 ...
- python多线程队列和池_Python3 从零单排28_线程队列进程池线程池
1.线程队列 线程队列有三种:先进先出,后进先出,按优先级进出,具体如下: 1 importqueue2 3 #先进先出 4 q = queue.Queue(3)5 6 q.put(1)7 q.put ...
- python多线程队列处理_Python线程和队列使用的一点思考
Python线程和队列使用的一点思考 1. 斗哥采访环节请问为什么要使用线程? 答:为了提高程序速度,代码效率呀. 请问为什么要使用队列? 答:个人认为队列可以保证线程安全,实现线程间的同步,比较稳. ...
- Python之路 34:并发与并行、锁(GIL、同步锁、死锁与递归锁)、信号量、线程队列、生消模型、进程(基础使用、进程通信、进程池、回调函数)、协程
内容: 同步锁 死锁.递归锁 信号量和同步对象(暂时了解即可) 队列------生产者和消费者模型 进程(基础使用.进程通信.进程池.回调函数) 协程 一.并发并行与同步异步的概念 1.1.并发和并行 ...
- 0820Python总结-线程队列,进程池和线程池,回调函数,协程
一.线程队列 from queue import Queue put 存 get 取 put_nowait 存,超出了队列长度,报错 get_nowait 取,没数据时,直接报错 Linux Wind ...
- 【Linux入门】多线程(线程概念、生产者消费者模型、消息队列、线程池)万字解说
目录 1️⃣线程概念 什么是线程 线程的优点 线程的缺点 线程异常 线程异常 Linux进程VS线程 2️⃣线程控制 创建线程 获取线程的id 线程终止 等待线程 线程分离 3️⃣线程互斥 进程线程间 ...
- python多线程为什么要用队列_Python程序中的线程操作-线程队列
一.线程队列 queue队列:使用import queue,用法与进程Queue一样 queue is especially useful in threaded programming when i ...
- Tensorflow多线程输入数据处理框架(一)——队列与多线程
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 对于队列,修改队列状态的操作主要有Enqueue.EnqueueMany和Dequeue.以下程序展示了如何使用这 ...
最新文章
- nginx和mysql链接_nginx转发mysql连接
- Unbutu下安装mysql服务并允许远程登录
- Java实现螺旋矩阵
- 服务器所有文件,检索服务器端文件夹中的所有文件
- 深度学习基本概念笔记
- 64位ubuntu arm-linux-gcc,在ubuntu 64位的机器上执行arm-linux-gcc提示 no such file or directory【转】...
- 40vf什么意思_变频器的VF模式是什么意思?VF什么意思
- 【英语学习】【Daily English】U13 Holiday L04 How was it?
- 学习成为一个IT架构师
- 营业执照psd模板2020_荣誉证书聘书奖状模板,CFR矢量素材PSD源文件,700张精美套用...
- php树形结构数组转化
- 使用post访问不到接口_Postman调试依赖登录接口的3种方法
- python之Character string
- Java学习笔记——多线程
- WIN7下odbc数据源配置问题
- 如何在中国大陆三大运营商申请公网IPV4地址
- java泛型(1) 认识泛型
- 【100+ python基础入门-32】元组元素的增删改查操作方法总结
- Android 天气APP(十九)更换新版API接口(更高、更快、更强)
- matlab carcasonne,【My songs】原创英文歌词翻译
热门文章
- 解决微信小程序新建项目没有样式问题,以及官方demo
- 奔腾双核linux服务器,Dell推出双核心奔腾服务器
- php date函数实现,PHP date() 函数可实现的功能列表
- huffman算法c语言实验报告,huffman二叉树实验报告--数据结构(c语言).doc
- 喜用神最正确的算法_各种电磁仿真算法的优缺点和适用范围(FDTD, FEM和MOM等)...
- jsp九大内置对象与servlet中java对象
- 服务器怎么修改密码_亚马逊账号登陆不上,修改密码后遭冻结怎么办?有没有什么申诉的办法?...
- 【2017年第4期】工业大数据技术与架构
- 【2017年第3期】专题:面向社会治理和服务的大数据
- 获奖者:​郑纬民,男,清华大学教授、博士生导师,《大数据》杂志主编。...